; LLVM IR from attractivechaos/klib :: keigen (ke_core_strq)

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

; Function Attrs: nounwind uwtable
define dso_local void @ke_core_strq(i32 noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3) #0 {
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca double, align 8
  %15 = alloca double, align 8
  %16 = alloca double, align 8
  %17 = alloca double, align 8
  store i32 %0, ptr %5, align 4, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !9
  store ptr %2, ptr %7, align 8, !tbaa !9
  store ptr %3, ptr %8, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #4
  %18 = load i32, ptr %5, align 4, !tbaa !5
  %19 = sub nsw i32 %18, 1
  store i32 %19, ptr %9, align 4, !tbaa !5
  br label %20

20:                                               ; preds = %343, %4
  %21 = load i32, ptr %9, align 4, !tbaa !5
  %22 = icmp sge i32 %21, 1
  br i1 %22, label %23, label %346

23:                                               ; preds = %20
  store double 0.000000e+00, ptr %14, align 8, !tbaa !11
  %24 = load i32, ptr %9, align 4, !tbaa !5
  %25 = icmp sgt i32 %24, 1
  br i1 %25, label %26, label %53

26:                                               ; preds = %23
  store i32 0, ptr %11, align 4, !tbaa !5
  br label %27

27:                                               ; preds = %49, %26
  %28 = load i32, ptr %11, align 4, !tbaa !5
  %29 = load i32, ptr %9, align 4, !tbaa !5
  %30 = icmp slt i32 %28, %29
  br i1 %30, label %31, label %52

31:                                               ; preds = %27
  %32 = load i32, ptr %9, align 4, !tbaa !5
  %33 = load i32, ptr %5, align 4, !tbaa !5
  %34 = mul nsw i32 %32, %33
  %35 = load i32, ptr %11, align 4, !tbaa !5
  %36 = add nsw i32 %34, %35
  store i32 %36, ptr %12, align 4, !tbaa !5
  %37 = load double, ptr %14, align 8, !tbaa !11
  %38 = load ptr, ptr %6, align 8, !tbaa !9
  %39 = load i32, ptr %12, align 4, !tbaa !5
  %40 = sext i32 %39 to i64
  %41 = getelementptr inbounds double, ptr %38, i64 %40
  %42 = load double, ptr %41, align 8, !tbaa !11
  %43 = load ptr, ptr %6, align 8, !tbaa !9
  %44 = load i32, ptr %12, align 4, !tbaa !5
  %45 = sext i32 %44 to i64
  %46 = getelementptr inbounds double, ptr %43, i64 %45
  %47 = load double, ptr %46, align 8, !tbaa !11
  %48 = call double @llvm.fmuladd.f64(double %42, double %47, double %37)
  store double %48, ptr %14, align 8, !tbaa !11
  br label %49

49:                                               ; preds = %31
  %50 = load i32, ptr %11, align 4, !tbaa !5
  %51 = add nsw i32 %50, 1
  store i32 %51, ptr %11, align 4, !tbaa !5
  br label %27, !llvm.loop !13

52:                                               ; preds = %27
  br label %53

53:                                               ; preds = %52, %23
  %54 = load double, ptr %14, align 8, !tbaa !11
  %55 = fadd double %54, 1.000000e+00
  %56 = fcmp oeq double %55, 1.000000e+00
  br i1 %56, label %57, label %84

57:                                               ; preds = %53
  %58 = load ptr, ptr %8, align 8, !tbaa !9
  %59 = load i32, ptr %9, align 4, !tbaa !5
  %60 = sext i32 %59 to i64
  %61 = getelementptr inbounds double, ptr %58, i64 %60
  store double 0.000000e+00, ptr %61, align 8, !tbaa !11
  %62 = load i32, ptr %9, align 4, !tbaa !5
  %63 = icmp eq i32 %62, 1
  br i1 %63, label %64, label %79

64:                                               ; preds = %57
  %65 = load ptr, ptr %6, align 8, !tbaa !9
  %66 = load i32, ptr %9, align 4, !tbaa !5
  %67 = load i32, ptr %5, align 4, !tbaa !5
  %68 = mul nsw i32 %66, %67
  %69 = load i32, ptr %9, align 4, !tbaa !5
  %70 = add nsw i32 %68, %69
  %71 = sub nsw i32 %70, 1
  %72 = sext i32 %71 to i64
  %73 = getelementptr inbounds double, ptr %65, i64 %72
  %74 = load double, ptr %73, align 8, !tbaa !11
  %75 = load ptr, ptr %8, align 8, !tbaa !9
  %76 = load i32, ptr %9, align 4, !tbaa !5
  %77 = sext i32 %76 to i64
  %78 = getelementptr inbounds double, ptr %75, i64 %77
  store double %74, ptr %78, align 8, !tbaa !11
  br label %79

79:                                               ; preds = %64, %57
  %80 = load ptr, ptr %7, align 8, !tbaa !9
  %81 = load i32, ptr %9, align 4, !tbaa !5
  %82 = sext i32 %81 to i64
  %83 = getelementptr inbounds double, ptr %80, i64 %82
  store double 0.000000e+00, ptr %83, align 8, !tbaa !11
  br label %342

84:                                               ; preds = %53
  %85 = load double, ptr %14, align 8, !tbaa !11
  %86 = call double @sqrt(double noundef %85) #4
  %87 = load ptr, ptr %8, align 8, !tbaa !9
  %88 = load i32, ptr %9, align 4, !tbaa !5
  %89 = sext i32 %88 to i64
  %90 = getelementptr inbounds double, ptr %87, i64 %89
  store double %86, ptr %90, align 8, !tbaa !11
  %91 = load i32, ptr %9, align 4, !tbaa !5
  %92 = load i32, ptr %5, align 4, !tbaa !5
  %93 = mul nsw i32 %91, %92
  %94 = load i32, ptr %9, align 4, !tbaa !5
  %95 = add nsw i32 %93, %94
  %96 = sub nsw i32 %95, 1
  store i32 %96, ptr %12, align 4, !tbaa !5
  %97 = load ptr, ptr %6, align 8, !tbaa !9
  %98 = load i32, ptr %12, align 4, !tbaa !5
  %99 = sext i32 %98 to i64
  %100 = getelementptr inbounds double, ptr %97, i64 %99
  %101 = load double, ptr %100, align 8, !tbaa !11
  %102 = fcmp ogt double %101, 0.000000e+00
  br i1 %102, label %103, label %114

103:                                              ; preds = %84
  %104 = load ptr, ptr %8, align 8, !tbaa !9
  %105 = load i32, ptr %9, align 4, !tbaa !5
  %106 = sext i32 %105 to i64
  %107 = getelementptr inbounds double, ptr %104, i64 %106
  %108 = load double, ptr %107, align 8, !tbaa !11
  %109 = fneg double %108
  %110 = load ptr, ptr %8, align 8, !tbaa !9
  %111 = load i32, ptr %9, align 4, !tbaa !5
  %112 = sext i32 %111 to i64
  %113 = getelementptr inbounds double, ptr %110, i64 %112
  store double %109, ptr %113, align 8, !tbaa !11
  br label %114

114:                                              ; preds = %103, %84
  %115 = load double, ptr %14, align 8, !tbaa !11
  %116 = load ptr, ptr %6, align 8, !tbaa !9
  %117 = load i32, ptr %12, align 4, !tbaa !5
  %118 = sext i32 %117 to i64
  %119 = getelementptr inbounds double, ptr %116, i64 %118
  %120 = load double, ptr %119, align 8, !tbaa !11
  %121 = load ptr, ptr %8, align 8, !tbaa !9
  %122 = load i32, ptr %9, align 4, !tbaa !5
  %123 = sext i32 %122 to i64
  %124 = getelementptr inbounds double, ptr %121, i64 %123
  %125 = load double, ptr %124, align 8, !tbaa !11
  %126 = fneg double %120
  %127 = call double @llvm.fmuladd.f64(double %126, double %125, double %115)
  store double %127, ptr %14, align 8, !tbaa !11
  %128 = load ptr, ptr %6, align 8, !tbaa !9
  %129 = load i32, ptr %12, align 4, !tbaa !5
  %130 = sext i32 %129 to i64
  %131 = getelementptr inbounds double, ptr %128, i64 %130
  %132 = load double, ptr %131, align 8, !tbaa !11
  %133 = load ptr, ptr %8, align 8, !tbaa !9
  %134 = load i32, ptr %9, align 4, !tbaa !5
  %135 = sext i32 %134 to i64
  %136 = getelementptr inbounds double, ptr %133, i64 %135
  %137 = load double, ptr %136, align 8, !tbaa !11
  %138 = fsub double %132, %137
  %139 = load ptr, ptr %6, align 8, !tbaa !9
  %140 = load i32, ptr %12, align 4, !tbaa !5
  %141 = sext i32 %140 to i64
  %142 = getelementptr inbounds double, ptr %139, i64 %141
  store double %138, ptr %142, align 8, !tbaa !11
  store double 0.000000e+00, ptr %15, align 8, !tbaa !11
  store i32 0, ptr %10, align 4, !tbaa !5
  br label %143

143:                                              ; preds = %253, %114
  %144 = load i32, ptr %10, align 4, !tbaa !5
  %145 = load i32, ptr %9, align 4, !tbaa !5
  %146 = icmp slt i32 %144, %145
  br i1 %146, label %147, label %256

147:                                              ; preds = %143
  %148 = load ptr, ptr %6, align 8, !tbaa !9
  %149 = load i32, ptr %9, align 4, !tbaa !5
  %150 = load i32, ptr %5, align 4, !tbaa !5
  %151 = mul nsw i32 %149, %150
  %152 = load i32, ptr %10, align 4, !tbaa !5
  %153 = add nsw i32 %151, %152
  %154 = sext i32 %153 to i64
  %155 = getelementptr inbounds double, ptr %148, i64 %154
  %156 = load double, ptr %155, align 8, !tbaa !11
  %157 = load double, ptr %14, align 8, !tbaa !11
  %158 = fdiv double %156, %157
  %159 = load ptr, ptr %6, align 8, !tbaa !9
  %160 = load i32, ptr %10, align 4, !tbaa !5
  %161 = load i32, ptr %5, align 4, !tbaa !5
  %162 = mul nsw i32 %160, %161
  %163 = load i32, ptr %9, align 4, !tbaa !5
  %164 = add nsw i32 %162, %163
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds double, ptr %159, i64 %165
  store double %158, ptr %166, align 8, !tbaa !11
  store double 0.000000e+00, ptr %16, align 8, !tbaa !11
  store i32 0, ptr %11, align 4, !tbaa !5
  br label %167

167:                                              ; preds = %192, %147
  %168 = load i32, ptr %11, align 4, !tbaa !5
  %169 = load i32, ptr %10, align 4, !tbaa !5
  %170 = icmp sle i32 %168, %169
  br i1 %170, label %171, label %195

171:                                              ; preds = %167
  %172 = load double, ptr %16, align 8, !tbaa !11
  %173 = load ptr, ptr %6, align 8, !tbaa !9
  %174 = load i32, ptr %10, align 4, !tbaa !5
  %175 = load i32, ptr %5, align 4, !tbaa !5
  %176 = mul nsw i32 %174, %175
  %177 = load i32, ptr %11, align 4, !tbaa !5
  %178 = add nsw i32 %176, %177
  %179 = sext i32 %178 to i64
  %180 = getelementptr inbounds double, ptr %173, i64 %179
  %181 = load double, ptr %180, align 8, !tbaa !11
  %182 = load ptr, ptr %6, align 8, !tbaa !9
  %183 = load i32, ptr %9, align 4, !tbaa !5
  %184 = load i32, ptr %5, align 4, !tbaa !5
  %185 = mul nsw i32 %183, %184
  %186 = load i32, ptr %11, align 4, !tbaa !5
  %187 = add nsw i32 %185, %186
  %188 = sext i32 %187 to i64
  %189 = getelementptr inbounds double, ptr %182, i64 %188
  %190 = load double, ptr %189, align 8, !tbaa !11
  %191 = call double @llvm.fmuladd.f64(double %181, double %190, double %172)
  store double %191, ptr %16, align 8, !tbaa !11
  br label %192

192:                                              ; preds = %171
  %193 = load i32, ptr %11, align 4, !tbaa !5
  %194 = add nsw i32 %193, 1
  store i32 %194, ptr %11, align 4, !tbaa !5
  br label %167, !llvm.loop !15

195:                                              ; preds = %167
  %196 = load i32, ptr %10, align 4, !tbaa !5
  %197 = add nsw i32 %196, 1
  %198 = load i32, ptr %9, align 4, !tbaa !5
  %199 = icmp slt i32 %197, %198
  br i1 %199, label %200, label %233

200:                                              ; preds = %195
  %201 = load i32, ptr %10, align 4, !tbaa !5
  %202 = add nsw i32 %201, 1
  store i32 %202, ptr %11, align 4, !tbaa !5
  br label %203

203:                                              ; preds = %229, %200
  %204 = load i32, ptr %11, align 4, !tbaa !5
  %205 = load i32, ptr %9, align 4, !tbaa !5
  %206 = sub nsw i32 %205, 1
  %207 = icmp sle i32 %204, %206
  br i1 %207, label %208, label %232

208:                                              ; preds = %203
  %209 = load double, ptr %16, align 8, !tbaa !11
  %210 = load ptr, ptr %6, align 8, !tbaa !9
  %211 = load i32, ptr %11, align 4, !tbaa !5
  %212 = load i32, ptr %5, align 4, !tbaa !5
  %213 = mul nsw i32 %211, %212
  %214 = load i32, ptr %10, align 4, !tbaa !5
  %215 = add nsw i32 %213, %214
  %216 = sext i32 %215 to i64
  %217 = getelementptr inbounds double, ptr %210, i64 %216
  %218 = load double, ptr %217, align 8, !tbaa !11
  %219 = load ptr, ptr %6, align 8, !tbaa !9
  %220 = load i32, ptr %9, align 4, !tbaa !5
  %221 = load i32, ptr %5, align 4, !tbaa !5
  %222 = mul nsw i32 %220, %221
  %223 = load i32, ptr %11, align 4, !tbaa !5
  %224 = add nsw i32 %222, %223
  %225 = sext i32 %224 to i64
  %226 = getelementptr inbounds double, ptr %219, i64 %225
  %227 = load double, ptr %226, align 8, !tbaa !11
  %228 = call double @llvm.fmuladd.f64(double %218, double %227, double %209)
  store double %228, ptr %16, align 8, !tbaa !11
  br label %229

229:                                              ; preds = %208
  %230 = load i32, ptr %11, align 4, !tbaa !5
  %231 = add nsw i32 %230, 1
  store i32 %231, ptr %11, align 4, !tbaa !5
  br label %203, !llvm.loop !16

232:                                              ; preds = %203
  br label %233

233:                                              ; preds = %232, %195
  %234 = load double, ptr %16, align 8, !tbaa !11
  %235 = load double, ptr %14, align 8, !tbaa !11
  %236 = fdiv double %234, %235
  %237 = load ptr, ptr %8, align 8, !tbaa !9
  %238 = load i32, ptr %10, align 4, !tbaa !5
  %239 = sext i32 %238 to i64
  %240 = getelementptr inbounds double, ptr %237, i64 %239
  store double %236, ptr %240, align 8, !tbaa !11
  %241 = load double, ptr %15, align 8, !tbaa !11
  %242 = load double, ptr %16, align 8, !tbaa !11
  %243 = load ptr, ptr %6, align 8, !tbaa !9
  %244 = load i32, ptr %10, align 4, !tbaa !5
  %245 = load i32, ptr %5, align 4, !tbaa !5
  %246 = mul nsw i32 %244, %245
  %247 = load i32, ptr %9, align 4, !tbaa !5
  %248 = add nsw i32 %246, %247
  %249 = sext i32 %248 to i64
  %250 = getelementptr inbounds double, ptr %243, i64 %249
  %251 = load double, ptr %250, align 8, !tbaa !11
  %252 = call double @llvm.fmuladd.f64(double %242, double %251, double %241)
  store double %252, ptr %15, align 8, !tbaa !11
  br label %253

253:                                              ; preds = %233
  %254 = load i32, ptr %10, align 4, !tbaa !5
  %255 = add nsw i32 %254, 1
  store i32 %255, ptr %10, align 4, !tbaa !5
  br label %143, !llvm.loop !17

256:                                              ; preds = %143
  %257 = load double, ptr %15, align 8, !tbaa !11
  %258 = load double, ptr %14, align 8, !tbaa !11
  %259 = load double, ptr %14, align 8, !tbaa !11
  %260 = fadd double %258, %259
  %261 = fdiv double %257, %260
  store double %261, ptr %17, align 8, !tbaa !11
  store i32 0, ptr %10, align 4, !tbaa !5
  br label %262

262:                                              ; preds = %333, %256
  %263 = load i32, ptr %10, align 4, !tbaa !5
  %264 = load i32, ptr %9, align 4, !tbaa !5
  %265 = icmp slt i32 %263, %264
  br i1 %265, label %266, label %336

266:                                              ; preds = %262
  %267 = load ptr, ptr %6, align 8, !tbaa !9
  %268 = load i32, ptr %9, align 4, !tbaa !5
  %269 = load i32, ptr %5, align 4, !tbaa !5
  %270 = mul nsw i32 %268, %269
  %271 = load i32, ptr %10, align 4, !tbaa !5
  %272 = add nsw i32 %270, %271
  %273 = sext i32 %272 to i64
  %274 = getelementptr inbounds double, ptr %267, i64 %273
  %275 = load double, ptr %274, align 8, !tbaa !11
  store double %275, ptr %15, align 8, !tbaa !11
  %276 = load ptr, ptr %8, align 8, !tbaa !9
  %277 = load i32, ptr %10, align 4, !tbaa !5
  %278 = sext i32 %277 to i64
  %279 = getelementptr inbounds double, ptr %276, i64 %278
  %280 = load double, ptr %279, align 8, !tbaa !11
  %281 = load double, ptr %17, align 8, !tbaa !11
  %282 = load double, ptr %15, align 8, !tbaa !11
  %283 = fneg double %281
  %284 = call double @llvm.fmuladd.f64(double %283, double %282, double %280)
  store double %284, ptr %16, align 8, !tbaa !11
  %285 = load double, ptr %16, align 8, !tbaa !11
  %286 = load ptr, ptr %8, align 8, !tbaa !9
  %287 = load i32, ptr %10, align 4, !tbaa !5
  %288 = sext i32 %287 to i64
  %289 = getelementptr inbounds double, ptr %286, i64 %288
  store double %285, ptr %289, align 8, !tbaa !11
  store i32 0, ptr %11, align 4, !tbaa !5
  br label %290

290:                                              ; preds = %329, %266
  %291 = load i32, ptr %11, align 4, !tbaa !5
  %292 = load i32, ptr %10, align 4, !tbaa !5
  %293 = icmp sle i32 %291, %292
  br i1 %293, label %294, label %332

294:                                              ; preds = %290
  %295 = load i32, ptr %10, align 4, !tbaa !5
  %296 = load i32, ptr %5, align 4, !tbaa !5
  %297 = mul nsw i32 %295, %296
  %298 = load i32, ptr %11, align 4, !tbaa !5
  %299 = add nsw i32 %297, %298
  store i32 %299, ptr %12, align 4, !tbaa !5
  %300 = load ptr, ptr %6, align 8, !tbaa !9
  %301 = load i32, ptr %12, align 4, !tbaa !5
  %302 = sext i32 %301 to i64
  %303 = getelementptr inbounds double, ptr %300, i64 %302
  %304 = load double, ptr %303, align 8, !tbaa !11
  %305 = load double, ptr %15, align 8, !tbaa !11
  %306 = load ptr, ptr %8, align 8, !tbaa !9
  %307 = load i32, ptr %11, align 4, !tbaa !5
  %308 = sext i32 %307 to i64
  %309 = getelementptr inbounds double, ptr %306, i64 %308
  %310 = load double, ptr %309, align 8, !tbaa !11
  %311 = fneg double %305
  %312 = call double @llvm.fmuladd.f64(double %311, double %310, double %304)
  %313 = load double, ptr %16, align 8, !tbaa !11
  %314 = load ptr, ptr %6, align 8, !tbaa !9
  %315 = load i32, ptr %9, align 4, !tbaa !5
  %316 = load i32, ptr %5, align 4, !tbaa !5
  %317 = mul nsw i32 %315, %316
  %318 = load i32, ptr %11, align 4, !tbaa !5
  %319 = add nsw i32 %317, %318
  %320 = sext i32 %319 to i64
  %321 = getelementptr inbounds double, ptr %314, i64 %320
  %322 = load double, ptr %321, align 8, !tbaa !11
  %323 = fneg double %313
  %324 = call double @llvm.fmuladd.f64(double %323, double %322, double %312)
  %325 = load ptr, ptr %6, align 8, !tbaa !9
  %326 = load i32, ptr %12, align 4, !tbaa !5
  %327 = sext i32 %326 to i64
  %328 = getelementptr inbounds double, ptr %325, i64 %327
  store double %324, ptr %328, align 8, !tbaa !11
  br label %329

329:                                              ; preds = %294
  %330 = load i32, ptr %11, align 4, !tbaa !5
  %331 = add nsw i32 %330, 1
  store i32 %331, ptr %11, align 4, !tbaa !5
  br label %290, !llvm.loop !18

332:                                              ; preds = %290
  br label %333

333:                                              ; preds = %332
  %334 = load i32, ptr %10, align 4, !tbaa !5
  %335 = add nsw i32 %334, 1
  store i32 %335, ptr %10, align 4, !tbaa !5
  br label %262, !llvm.loop !19

336:                                              ; preds = %262
  %337 = load double, ptr %14, align 8, !tbaa !11
  %338 = load ptr, ptr %7, align 8, !tbaa !9
  %339 = load i32, ptr %9, align 4, !tbaa !5
  %340 = sext i32 %339 to i64
  %341 = getelementptr inbounds double, ptr %338, i64 %340
  store double %337, ptr %341, align 8, !tbaa !11
  br label %342

342:                                              ; preds = %336, %79
  br label %343

343:                                              ; preds = %342
  %344 = load i32, ptr %9, align 4, !tbaa !5
  %345 = add nsw i32 %344, -1
  store i32 %345, ptr %9, align 4, !tbaa !5
  br label %20, !llvm.loop !20

346:                                              ; preds = %20
  store i32 0, ptr %9, align 4, !tbaa !5
  br label %347

347:                                              ; preds = %363, %346
  %348 = load i32, ptr %9, align 4, !tbaa !5
  %349 = load i32, ptr %5, align 4, !tbaa !5
  %350 = sub nsw i32 %349, 1
  %351 = icmp slt i32 %348, %350
  br i1 %351, label %352, label %366

352:                                              ; preds = %347
  %353 = load ptr, ptr %8, align 8, !tbaa !9
  %354 = load i32, ptr %9, align 4, !tbaa !5
  %355 = add nsw i32 %354, 1
  %356 = sext i32 %355 to i64
  %357 = getelementptr inbounds double, ptr %353, i64 %356
  %358 = load double, ptr %357, align 8, !tbaa !11
  %359 = load ptr, ptr %8, align 8, !tbaa !9
  %360 = load i32, ptr %9, align 4, !tbaa !5
  %361 = sext i32 %360 to i64
  %362 = getelementptr inbounds double, ptr %359, i64 %361
  store double %358, ptr %362, align 8, !tbaa !11
  br label %363

363:                                              ; preds = %352
  %364 = load i32, ptr %9, align 4, !tbaa !5
  %365 = add nsw i32 %364, 1
  store i32 %365, ptr %9, align 4, !tbaa !5
  br label %347, !llvm.loop !21

366:                                              ; preds = %347
  %367 = load ptr, ptr %8, align 8, !tbaa !9
  %368 = load i32, ptr %5, align 4, !tbaa !5
  %369 = sub nsw i32 %368, 1
  %370 = sext i32 %369 to i64
  %371 = getelementptr inbounds double, ptr %367, i64 %370
  store double 0.000000e+00, ptr %371, align 8, !tbaa !11
  %372 = load ptr, ptr %7, align 8, !tbaa !9
  %373 = getelementptr inbounds double, ptr %372, i64 0
  store double 0.000000e+00, ptr %373, align 8, !tbaa !11
  store i32 0, ptr %9, align 4, !tbaa !5
  br label %374

374:                                              ; preds = %512, %366
  %375 = load i32, ptr %9, align 4, !tbaa !5
  %376 = load i32, ptr %5, align 4, !tbaa !5
  %377 = icmp slt i32 %375, %376
  br i1 %377, label %378, label %515

378:                                              ; preds = %374
  %379 = load ptr, ptr %7, align 8, !tbaa !9
  %380 = load i32, ptr %9, align 4, !tbaa !5
  %381 = sext i32 %380 to i64
  %382 = getelementptr inbounds double, ptr %379, i64 %381
  %383 = load double, ptr %382, align 8, !tbaa !11
  %384 = fcmp une double %383, 0.000000e+00
  br i1 %384, label %385, label %463

385:                                              ; preds = %378
  %386 = load i32, ptr %9, align 4, !tbaa !5
  %387 = sub nsw i32 %386, 1
  %388 = icmp sge i32 %387, 0
  br i1 %388, label %389, label %463

389:                                              ; preds = %385
  store i32 0, ptr %10, align 4, !tbaa !5
  br label %390

390:                                              ; preds = %459, %389
  %391 = load i32, ptr %10, align 4, !tbaa !5
  %392 = load i32, ptr %9, align 4, !tbaa !5
  %393 = icmp slt i32 %391, %392
  br i1 %393, label %394, label %462

394:                                              ; preds = %390
  store double 0.000000e+00, ptr %16, align 8, !tbaa !11
  store i32 0, ptr %11, align 4, !tbaa !5
  br label %395

395:                                              ; preds = %420, %394
  %396 = load i32, ptr %11, align 4, !tbaa !5
  %397 = load i32, ptr %9, align 4, !tbaa !5
  %398 = icmp slt i32 %396, %397
  br i1 %398, label %399, label %423

399:                                              ; preds = %395
  %400 = load double, ptr %16, align 8, !tbaa !11
  %401 = load ptr, ptr %6, align 8, !tbaa !9
  %402 = load i32, ptr %9, align 4, !tbaa !5
  %403 = load i32, ptr %5, align 4, !tbaa !5
  %404 = mul nsw i32 %402, %403
  %405 = load i32, ptr %11, align 4, !tbaa !5
  %406 = add nsw i32 %404, %405
  %407 = sext i32 %406 to i64
  %408 = getelementptr inbounds double, ptr %401, i64 %407
  %409 = load double, ptr %408, align 8, !tbaa !11
  %410 = load ptr, ptr %6, align 8, !tbaa !9
  %411 = load i32, ptr %11, align 4, !tbaa !5
  %412 = load i32, ptr %5, align 4, !tbaa !5
  %413 = mul nsw i32 %411, %412
  %414 = load i32, ptr %10, align 4, !tbaa !5
  %415 = add nsw i32 %413, %414
  %416 = sext i32 %415 to i64
  %417 = getelementptr inbounds double, ptr %410, i64 %416
  %418 = load double, ptr %417, align 8, !tbaa !11
  %419 = call double @llvm.fmuladd.f64(double %409, double %418, double %400)
  store double %419, ptr %16, align 8, !tbaa !11
  br label %420

420:                                              ; preds = %399
  %421 = load i32, ptr %11, align 4, !tbaa !5
  %422 = add nsw i32 %421, 1
  store i32 %422, ptr %11, align 4, !tbaa !5
  br label %395, !llvm.loop !22

423:                                              ; preds = %395
  store i32 0, ptr %11, align 4, !tbaa !5
  br label %424

424:                                              ; preds = %455, %423
  %425 = load i32, ptr %11, align 4, !tbaa !5
  %426 = load i32, ptr %9, align 4, !tbaa !5
  %427 = icmp slt i32 %425, %426
  br i1 %427, label %428, label %458

428:                                              ; preds = %424
  %429 = load i32, ptr %11, align 4, !tbaa !5
  %430 = load i32, ptr %5, align 4, !tbaa !5
  %431 = mul nsw i32 %429, %430
  %432 = load i32, ptr %10, align 4, !tbaa !5
  %433 = add nsw i32 %431, %432
  store i32 %433, ptr %12, align 4, !tbaa !5
  %434 = load ptr, ptr %6, align 8, !tbaa !9
  %435 = load i32, ptr %12, align 4, !tbaa !5
  %436 = sext i32 %435 to i64
  %437 = getelementptr inbounds double, ptr %434, i64 %436
  %438 = load double, ptr %437, align 8, !tbaa !11
  %439 = load double, ptr %16, align 8, !tbaa !11
  %440 = load ptr, ptr %6, align 8, !tbaa !9
  %441 = load i32, ptr %11, align 4, !tbaa !5
  %442 = load i32, ptr %5, align 4, !tbaa !5
  %443 = mul nsw i32 %441, %442
  %444 = load i32, ptr %9, align 4, !tbaa !5
  %445 = add nsw i32 %443, %444
  %446 = sext i32 %445 to i64
  %447 = getelementptr inbounds double, ptr %440, i64 %446
  %448 = load double, ptr %447, align 8, !tbaa !11
  %449 = fneg double %439
  %450 = call double @llvm.fmuladd.f64(double %449, double %448, double %438)
  %451 = load ptr, ptr %6, align 8, !tbaa !9
  %452 = load i32, ptr %12, align 4, !tbaa !5
  %453 = sext i32 %452 to i64
  %454 = getelementptr inbounds double, ptr %451, i64 %453
  store double %450, ptr %454, align 8, !tbaa !11
  br label %455

455:                                              ; preds = %428
  %456 = load i32, ptr %11, align 4, !tbaa !5
  %457 = add nsw i32 %456, 1
  store i32 %457, ptr %11, align 4, !tbaa !5
  br label %424, !llvm.loop !23

458:                                              ; preds = %424
  br label %459

459:                                              ; preds = %458
  %460 = load i32, ptr %10, align 4, !tbaa !5
  %461 = add nsw i32 %460, 1
  store i32 %461, ptr %10, align 4, !tbaa !5
  br label %390, !llvm.loop !24

462:                                              ; preds = %390
  br label %463

463:                                              ; preds = %462, %385, %378
  %464 = load i32, ptr %9, align 4, !tbaa !5
  %465 = load i32, ptr %5, align 4, !tbaa !5
  %466 = mul nsw i32 %464, %465
  %467 = load i32, ptr %9, align 4, !tbaa !5
  %468 = add nsw i32 %466, %467
  store i32 %468, ptr %12, align 4, !tbaa !5
  %469 = load ptr, ptr %6, align 8, !tbaa !9
  %470 = load i32, ptr %12, align 4, !tbaa !5
  %471 = sext i32 %470 to i64
  %472 = getelementptr inbounds double, ptr %469, i64 %471
  %473 = load double, ptr %472, align 8, !tbaa !11
  %474 = load ptr, ptr %7, align 8, !tbaa !9
  %475 = load i32, ptr %9, align 4, !tbaa !5
  %476 = sext i32 %475 to i64
  %477 = getelementptr inbounds double, ptr %474, i64 %476
  store double %473, ptr %477, align 8, !tbaa !11
  %478 = load ptr, ptr %6, align 8, !tbaa !9
  %479 = load i32, ptr %12, align 4, !tbaa !5
  %480 = sext i32 %479 to i64
  %481 = getelementptr inbounds double, ptr %478, i64 %480
  store double 1.000000e+00, ptr %481, align 8, !tbaa !11
  %482 = load i32, ptr %9, align 4, !tbaa !5
  %483 = sub nsw i32 %482, 1
  %484 = icmp sge i32 %483, 0
  br i1 %484, label %485, label %511

485:                                              ; preds = %463
  store i32 0, ptr %10, align 4, !tbaa !5
  br label %486

486:                                              ; preds = %507, %485
  %487 = load i32, ptr %10, align 4, !tbaa !5
  %488 = load i32, ptr %9, align 4, !tbaa !5
  %489 = icmp slt i32 %487, %488
  br i1 %489, label %490, label %510

490:                                              ; preds = %486
  %491 = load ptr, ptr %6, align 8, !tbaa !9
  %492 = load i32, ptr %9, align 4, !tbaa !5
  %493 = load i32, ptr %5, align 4, !tbaa !5
  %494 = mul nsw i32 %492, %493
  %495 = load i32, ptr %10, align 4, !tbaa !5
  %496 = add nsw i32 %494, %495
  %497 = sext i32 %496 to i64
  %498 = getelementptr inbounds double, ptr %491, i64 %497
  store double 0.000000e+00, ptr %498, align 8, !tbaa !11
  %499 = load ptr, ptr %6, align 8, !tbaa !9
  %500 = load i32, ptr %10, align 4, !tbaa !5
  %501 = load i32, ptr %5, align 4, !tbaa !5
  %502 = mul nsw i32 %500, %501
  %503 = load i32, ptr %9, align 4, !tbaa !5
  %504 = add nsw i32 %502, %503
  %505 = sext i32 %504 to i64
  %506 = getelementptr inbounds double, ptr %499, i64 %505
  store double 0.000000e+00, ptr %506, align 8, !tbaa !11
  br label %507

507:                                              ; preds = %490
  %508 = load i32, ptr %10, align 4, !tbaa !5
  %509 = add nsw i32 %508, 1
  store i32 %509, ptr %10, align 4, !tbaa !5
  br label %486, !llvm.loop !25

510:                                              ; preds = %486
  br label %511

511:                                              ; preds = %510, %463
  br label %512

512:                                              ; preds = %511
  %513 = load i32, ptr %9, align 4, !tbaa !5
  %514 = add nsw i32 %513, 1
  store i32 %514, ptr %9, align 4, !tbaa !5
  br label %374, !llvm.loop !26

515:                                              ; preds = %374
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  ret void
}

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

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

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = distinct !{!15, !14}
!16 = distinct !{!16, !14}
!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}


; 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: nofree nounwind memory(write, argmem: readwrite) uwtable
define dso_local void @ke_core_strq(i32 noundef %0, ptr nocapture noundef %1, ptr nocapture noundef %2, ptr nocapture noundef %3) local_unnamed_addr #0 {
  %5 = add i32 %0, -1
  %invariant.gep = getelementptr i8, ptr %1, i64 -8
  %6 = icmp sgt i32 %0, 1
  br i1 %6, label %.lr.ph257, label %._crit_edge260

.lr.ph257:                                        ; preds = %4
  %7 = zext nneg i32 %0 to i64
  %8 = getelementptr inbounds double, ptr %1, i64 %7
  %9 = zext nneg i32 %0 to i64
  %10 = getelementptr inbounds i8, ptr %3, i64 8
  %11 = shl nuw nsw i64 %9, 3
  %12 = shl nuw nsw i64 %9, 3
  %13 = add nuw nsw i64 %12, 8
  %14 = add nsw i64 %9, -2
  %invariant.gep482 = getelementptr i8, ptr %1, i64 8
  %invariant.gep478 = getelementptr i8, ptr %3, i64 8
  %invariant.gep480 = getelementptr i8, ptr %1, i64 8
  br label %19

.preheader232:                                    ; preds = %._crit_edge252
  br i1 %6, label %._crit_edge260.thread, label %._crit_edge260

._crit_edge260.thread:                            ; preds = %.preheader232
  %scevgep = getelementptr i8, ptr %3, i64 8
  %15 = zext nneg i32 %5 to i64
  %16 = shl nuw nsw i64 %15, 3
  tail call void @llvm.memmove.p0.p0.i64(ptr nonnull align 8 %3, ptr align 8 %scevgep, i64 %16, i1 false), !tbaa !5
  %17 = zext nneg i32 %5 to i64
  %18 = getelementptr inbounds double, ptr %3, i64 %17
  store double 0.000000e+00, ptr %18, align 8, !tbaa !5
  store double 0.000000e+00, ptr %2, align 8, !tbaa !5
  br label %.lr.ph268.preheader

19:                                               ; preds = %.lr.ph257, %._crit_edge252
  %indvar447 = phi i64 [ 0, %.lr.ph257 ], [ %indvar.next448, %._crit_edge252 ]
  %indvar = phi i32 [ 0, %.lr.ph257 ], [ %indvar.next, %._crit_edge252 ]
  %indvars.iv310.in = phi i64 [ %9, %.lr.ph257 ], [ %indvars.iv310, %._crit_edge252 ]
  %20 = xor i64 %indvar447, -1
  %21 = add i64 %20, %9
  %22 = xor i32 %indvar, -1
  %23 = add i32 %22, %0
  %24 = mul i32 %23, %0
  %25 = zext i32 %24 to i64
  %26 = shl nuw nsw i64 %25, 3
  %scevgep389 = getelementptr i8, ptr %1, i64 %26
  %indvars.iv310 = add nsw i64 %indvars.iv310.in, -1
  %indvars312 = trunc i64 %indvars.iv310 to i32
  %.not221 = icmp eq i64 %indvars.iv310, 1
  br i1 %.not221, label %47, label %.lr.ph

.lr.ph:                                           ; preds = %19
  %27 = sub i64 %14, %indvar447
  %28 = trunc i64 %indvars.iv310 to i32
  %29 = mul i32 %28, %0
  %30 = zext i32 %29 to i64
  %invariant.gep349 = getelementptr inbounds double, ptr %1, i64 %30
  %xtraiter = and i64 %21, 3
  %31 = icmp ult i64 %27, 3
  br i1 %31, label %._crit_edge.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph
  %unroll_iter = and i64 %21, -4
  br label %32

32:                                               ; preds = %32, %.lr.ph.new
  %indvars.iv = phi i64 [ 0, %.lr.ph.new ], [ %indvars.iv.next.3, %32 ]
  %.0207237 = phi double [ 0.000000e+00, %.lr.ph.new ], [ %40, %32 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.3, %32 ]
  %gep350 = getelementptr inbounds double, ptr %invariant.gep349, i64 %indvars.iv
  %33 = load double, ptr %gep350, align 8, !tbaa !5
  %34 = tail call double @llvm.fmuladd.f64(double %33, double %33, double %.0207237)
  %indvars.iv.next = or disjoint i64 %indvars.iv, 1
  %gep350.1 = getelementptr inbounds double, ptr %invariant.gep349, i64 %indvars.iv.next
  %35 = load double, ptr %gep350.1, align 8, !tbaa !5
  %36 = tail call double @llvm.fmuladd.f64(double %35, double %35, double %34)
  %indvars.iv.next.1 = or disjoint i64 %indvars.iv, 2
  %gep350.2 = getelementptr inbounds double, ptr %invariant.gep349, i64 %indvars.iv.next.1
  %37 = load double, ptr %gep350.2, align 8, !tbaa !5
  %38 = tail call double @llvm.fmuladd.f64(double %37, double %37, double %36)
  %indvars.iv.next.2 = or disjoint i64 %indvars.iv, 3
  %gep350.3 = getelementptr inbounds double, ptr %invariant.gep349, i64 %indvars.iv.next.2
  %39 = load double, ptr %gep350.3, align 8, !tbaa !5
  %40 = tail call double @llvm.fmuladd.f64(double %39, double %39, double %38)
  %indvars.iv.next.3 = add nuw nsw i64 %indvars.iv, 4
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %._crit_edge.unr-lcssa, label %32, !llvm.loop !9

._crit_edge.unr-lcssa:                            ; preds = %32, %.lr.ph
  %.lcssa443.ph = phi double [ poison, %.lr.ph ], [ %40, %32 ]
  %indvars.iv.unr = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next.3, %32 ]
  %.0207237.unr = phi double [ 0.000000e+00, %.lr.ph ], [ %40, %32 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge.unr-lcssa, %.epil.preheader
  %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %.epil.preheader ], [ %indvars.iv.unr, %._crit_edge.unr-lcssa ]
  %.0207237.epil = phi double [ %42, %.epil.preheader ], [ %.0207237.unr, %._crit_edge.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge.unr-lcssa ]
  %gep350.epil = getelementptr inbounds double, ptr %invariant.gep349, i64 %indvars.iv.epil
  %41 = load double, ptr %gep350.epil, align 8, !tbaa !5
  %42 = tail call double @llvm.fmuladd.f64(double %41, double %41, double %.0207237.epil)
  %indvars.iv.next.epil = add nuw nsw i64 %indvars.iv.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge, label %.epil.preheader, !llvm.loop !11

._crit_edge:                                      ; preds = %.epil.preheader, %._crit_edge.unr-lcssa
  %.lcssa443 = phi double [ %.lcssa443.ph, %._crit_edge.unr-lcssa ], [ %42, %.epil.preheader ]
  %43 = fadd double %.lcssa443, 1.000000e+00
  %44 = fcmp oeq double %43, 1.000000e+00
  br i1 %44, label %45, label %49

45:                                               ; preds = %._crit_edge
  %46 = getelementptr inbounds double, ptr %3, i64 %indvars.iv310
  store double 0.000000e+00, ptr %46, align 8, !tbaa !5
  br label %._crit_edge252

47:                                               ; preds = %19
  store double 0.000000e+00, ptr %10, align 8, !tbaa !5
  %48 = load double, ptr %8, align 8, !tbaa !5
  store double %48, ptr %10, align 8, !tbaa !5
  br label %._crit_edge252

49:                                               ; preds = %._crit_edge
  %50 = tail call double @sqrt(double noundef %.lcssa443) #5
  %51 = getelementptr inbounds double, ptr %3, i64 %indvars.iv310
  store double %50, ptr %51, align 8, !tbaa !5
  %52 = mul nsw i64 %indvars.iv310, %9
  %53 = mul nsw i32 %indvars312, %0
  %54 = sext i32 %53 to i64
  %55 = getelementptr double, ptr %invariant.gep, i64 %indvars.iv310
  %gep = getelementptr double, ptr %55, i64 %54
  %56 = load double, ptr %gep, align 8, !tbaa !5
  %57 = fcmp ogt double %56, 0.000000e+00
  br i1 %57, label %58, label %.lr.ph245.preheader

58:                                               ; preds = %49
  %59 = fneg double %50
  store double %59, ptr %51, align 8, !tbaa !5
  %.pre = load double, ptr %gep, align 8, !tbaa !5
  br label %.lr.ph245.preheader

.lr.ph245.preheader:                              ; preds = %49, %58
  %60 = phi double [ %59, %58 ], [ %50, %49 ]
  %61 = phi double [ %.pre, %58 ], [ %56, %49 ]
  %62 = fneg double %61
  %63 = tail call double @llvm.fmuladd.f64(double %62, double %60, double %.lcssa443)
  %64 = fsub double %61, %60
  store double %64, ptr %gep, align 8, !tbaa !5
  %65 = and i64 %52, 4294967295
  %invariant.gep359 = getelementptr inbounds double, ptr %1, i64 %65
  %invariant.gep361 = getelementptr double, ptr %1, i64 %indvars.iv310
  %invariant.gep353 = getelementptr inbounds double, ptr %1, i64 %65
  %invariant.gep357 = getelementptr inbounds double, ptr %1, i64 %65
  br label %.lr.ph245

.lr.ph245:                                        ; preds = %.lr.ph245.preheader, %.loopexit234
  %indvars.iv287 = phi i64 [ 0, %.lr.ph245.preheader ], [ %indvars.iv.next288, %.loopexit234 ]
  %indvars.iv282 = phi i64 [ 1, %.lr.ph245.preheader ], [ %indvars.iv.next283, %.loopexit234 ]
  %.0206243 = phi double [ 0.000000e+00, %.lr.ph245.preheader ], [ %95, %.loopexit234 ]
  %gep360 = getelementptr inbounds double, ptr %invariant.gep359, i64 %indvars.iv287
  %66 = load double, ptr %gep360, align 8, !tbaa !5
  %67 = fdiv double %66, %63
  %68 = mul nuw nsw i64 %indvars.iv287, %7
  %gep362 = getelementptr double, ptr %invariant.gep361, i64 %68
  store double %67, ptr %gep362, align 8, !tbaa !5
  %invariant.gep351 = getelementptr inbounds double, ptr %1, i64 %68
  %xtraiter451 = and i64 %indvars.iv282, 3
  %69 = icmp ult i64 %indvars.iv287, 3
  br i1 %69, label %.unr-lcssa, label %.lr.ph245.new

.lr.ph245.new:                                    ; preds = %.lr.ph245
  %unroll_iter455 = and i64 %indvars.iv282, 9223372036854775804
  br label %70

70:                                               ; preds = %70, %.lr.ph245.new
  %indvars.iv275 = phi i64 [ 0, %.lr.ph245.new ], [ %indvars.iv.next276.3, %70 ]
  %.0203239 = phi double [ 0.000000e+00, %.lr.ph245.new ], [ %82, %70 ]
  %niter456 = phi i64 [ 0, %.lr.ph245.new ], [ %niter456.next.3, %70 ]
  %gep352 = getelementptr inbounds double, ptr %invariant.gep351, i64 %indvars.iv275
  %71 = load double, ptr %gep352, align 8, !tbaa !5
  %gep354 = getelementptr inbounds double, ptr %invariant.gep353, i64 %indvars.iv275
  %72 = load double, ptr %gep354, align 8, !tbaa !5
  %73 = tail call double @llvm.fmuladd.f64(double %71, double %72, double %.0203239)
  %indvars.iv.next276 = or disjoint i64 %indvars.iv275, 1
  %gep352.1 = getelementptr inbounds double, ptr %invariant.gep351, i64 %indvars.iv.next276
  %74 = load double, ptr %gep352.1, align 8, !tbaa !5
  %gep354.1 = getelementptr inbounds double, ptr %invariant.gep353, i64 %indvars.iv.next276
  %75 = load double, ptr %gep354.1, align 8, !tbaa !5
  %76 = tail call double @llvm.fmuladd.f64(double %74, double %75, double %73)
  %indvars.iv.next276.1 = or disjoint i64 %indvars.iv275, 2
  %gep352.2 = getelementptr inbounds double, ptr %invariant.gep351, i64 %indvars.iv.next276.1
  %77 = load double, ptr %gep352.2, align 8, !tbaa !5
  %gep354.2 = getelementptr inbounds double, ptr %invariant.gep353, i64 %indvars.iv.next276.1
  %78 = load double, ptr %gep354.2, align 8, !tbaa !5
  %79 = tail call double @llvm.fmuladd.f64(double %77, double %78, double %76)
  %indvars.iv.next276.2 = or disjoint i64 %indvars.iv275, 3
  %gep352.3 = getelementptr inbounds double, ptr %invariant.gep351, i64 %indvars.iv.next276.2
  %80 = load double, ptr %gep352.3, align 8, !tbaa !5
  %gep354.3 = getelementptr inbounds double, ptr %invariant.gep353, i64 %indvars.iv.next276.2
  %81 = load double, ptr %gep354.3, align 8, !tbaa !5
  %82 = tail call double @llvm.fmuladd.f64(double %80, double %81, double %79)
  %indvars.iv.next276.3 = add nuw nsw i64 %indvars.iv275, 4
  %niter456.next.3 = add i64 %niter456, 4
  %niter456.ncmp.3 = icmp eq i64 %niter456.next.3, %unroll_iter455
  br i1 %niter456.ncmp.3, label %.unr-lcssa, label %70, !llvm.loop !13

.unr-lcssa:                                       ; preds = %70, %.lr.ph245
  %.lcssa444.ph = phi double [ poison, %.lr.ph245 ], [ %82, %70 ]
  %indvars.iv275.unr = phi i64 [ 0, %.lr.ph245 ], [ %indvars.iv.next276.3, %70 ]
  %.0203239.unr = phi double [ 0.000000e+00, %.lr.ph245 ], [ %82, %70 ]
  %lcmp.mod453.not = icmp eq i64 %xtraiter451, 0
  br i1 %lcmp.mod453.not, label %.epilog-lcssa, label %.epil.preheader450

.epil.preheader450:                               ; preds = %.unr-lcssa, %.epil.preheader450
  %indvars.iv275.epil = phi i64 [ %indvars.iv.next276.epil, %.epil.preheader450 ], [ %indvars.iv275.unr, %.unr-lcssa ]
  %.0203239.epil = phi double [ %85, %.epil.preheader450 ], [ %.0203239.unr, %.unr-lcssa ]
  %epil.iter452 = phi i64 [ %epil.iter452.next, %.epil.preheader450 ], [ 0, %.unr-lcssa ]
  %gep352.epil = getelementptr inbounds double, ptr %invariant.gep351, i64 %indvars.iv275.epil
  %83 = load double, ptr %gep352.epil, align 8, !tbaa !5
  %gep354.epil = getelementptr inbounds double, ptr %invariant.gep353, i64 %indvars.iv275.epil
  %84 = load double, ptr %gep354.epil, align 8, !tbaa !5
  %85 = tail call double @llvm.fmuladd.f64(double %83, double %84, double %.0203239.epil)
  %indvars.iv.next276.epil = add nuw nsw i64 %indvars.iv275.epil, 1
  %epil.iter452.next = add i64 %epil.iter452, 1
  %epil.iter452.cmp.not = icmp eq i64 %epil.iter452.next, %xtraiter451
  br i1 %epil.iter452.cmp.not, label %.epilog-lcssa, label %.epil.preheader450, !llvm.loop !14

.epilog-lcssa:                                    ; preds = %.epil.preheader450, %.unr-lcssa
  %.lcssa444 = phi double [ %.lcssa444.ph, %.unr-lcssa ], [ %85, %.epil.preheader450 ]
  %indvars.iv.next288 = add nuw nsw i64 %indvars.iv287, 1
  %86 = icmp slt i64 %indvars.iv.next288, %indvars.iv310
  br i1 %86, label %.preheader233.preheader, label %.loopexit234

.preheader233.preheader:                          ; preds = %.epilog-lcssa
  %invariant.gep355 = getelementptr inbounds double, ptr %1, i64 %indvars.iv287
  br label %.preheader233

.preheader233:                                    ; preds = %.preheader233.preheader, %.preheader233
  %indvars.iv284 = phi i64 [ %indvars.iv282, %.preheader233.preheader ], [ %indvars.iv.next285, %.preheader233 ]
  %.1204241 = phi double [ %.lcssa444, %.preheader233.preheader ], [ %90, %.preheader233 ]
  %87 = mul nuw nsw i64 %indvars.iv284, %7
  %gep356 = getelementptr inbounds double, ptr %invariant.gep355, i64 %87
  %88 = load double, ptr %gep356, align 8, !tbaa !5
  %gep358 = getelementptr inbounds double, ptr %invariant.gep357, i64 %indvars.iv284
  %89 = load double, ptr %gep358, align 8, !tbaa !5
  %90 = tail call double @llvm.fmuladd.f64(double %88, double %89, double %.1204241)
  %indvars.iv.next285 = add nuw nsw i64 %indvars.iv284, 1
  %sext = shl i64 %indvars.iv.next285, 32
  %91 = ashr exact i64 %sext, 32
  %.not224.not = icmp slt i64 %91, %indvars.iv310
  br i1 %.not224.not, label %.preheader233, label %.loopexit234, !llvm.loop !15

.loopexit234:                                     ; preds = %.preheader233, %.epilog-lcssa
  %.2205 = phi double [ %.lcssa444, %.epilog-lcssa ], [ %90, %.preheader233 ]
  %92 = fdiv double %.2205, %63
  %93 = getelementptr inbounds double, ptr %3, i64 %indvars.iv287
  store double %92, ptr %93, align 8, !tbaa !5
  %94 = load double, ptr %gep362, align 8, !tbaa !5
  %95 = tail call double @llvm.fmuladd.f64(double %.2205, double %94, double %.0206243)
  %indvars.iv.next283 = add nuw nsw i64 %indvars.iv282, 1
  %exitcond293.not = icmp eq i64 %indvars.iv.next288, %indvars.iv310
  br i1 %exitcond293.not, label %.lr.ph251, label %.lr.ph245, !llvm.loop !16

.lr.ph251:                                        ; preds = %.loopexit234
  %96 = fadd double %63, %63
  %97 = fneg double %95
  %98 = fdiv double %97, %96
  %99 = and i64 %52, 4294967295
  %invariant.gep367 = getelementptr inbounds double, ptr %1, i64 %99
  %invariant.gep365 = getelementptr inbounds double, ptr %1, i64 %99
  %gep483 = getelementptr i8, ptr %invariant.gep482, i64 %26
  br label %100

100:                                              ; preds = %.lr.ph251, %.loopexit439
  %indvars.iv303 = phi i64 [ 0, %.lr.ph251 ], [ %indvars.iv.next304, %.loopexit439 ]
  %indvars.iv301 = phi i64 [ 1, %.lr.ph251 ], [ %indvars.iv.next302, %.loopexit439 ]
  %gep368 = getelementptr inbounds double, ptr %invariant.gep367, i64 %indvars.iv303
  %101 = load double, ptr %gep368, align 8, !tbaa !5
  %102 = getelementptr inbounds double, ptr %3, i64 %indvars.iv303
  %103 = load double, ptr %102, align 8, !tbaa !5
  %104 = tail call double @llvm.fmuladd.f64(double %98, double %101, double %103)
  store double %104, ptr %102, align 8, !tbaa !5
  %105 = mul nuw nsw i64 %indvars.iv303, %7
  %106 = fneg double %101
  %107 = fneg double %104
  %invariant.gep363 = getelementptr inbounds double, ptr %1, i64 %105
  %min.iters.check = icmp ult i64 %indvars.iv301, 4
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %100
  %108 = shl i64 %indvars.iv303, 3
  %scevgep390 = getelementptr i8, ptr %gep483, i64 %108
  %gep479 = getelementptr i8, ptr %invariant.gep478, i64 %108
  %109 = mul i64 %13, %indvars.iv303
  %gep481 = getelementptr i8, ptr %invariant.gep480, i64 %109
  %110 = mul i64 %11, %indvars.iv303
  %scevgep386 = getelementptr i8, ptr %1, i64 %110
  %bound0 = icmp ult ptr %scevgep386, %gep479
  %bound1 = icmp ugt ptr %gep481, %3
  %found.conflict = and i1 %bound0, %bound1
  %bound0391 = icmp ult ptr %scevgep386, %scevgep390
  %bound1392 = icmp ult ptr %scevgep389, %gep481
  %found.conflict393 = and i1 %bound0391, %bound1392
  %conflict.rdx = or i1 %found.conflict, %found.conflict393
  br i1 %conflict.rdx, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %indvars.iv301, -4
  %broadcast.splatinsert = insertelement <2 x double> poison, double %106, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  %broadcast.splatinsert399 = insertelement <2 x double> poison, double %107, i64 0
  %broadcast.splat400 = shufflevector <2 x double> %broadcast.splatinsert399, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %111 = getelementptr inbounds double, ptr %invariant.gep363, i64 %index
  %112 = getelementptr inbounds i8, ptr %111, i64 16
  %wide.load = load <2 x double>, ptr %111, align 8, !tbaa !5, !alias.scope !17, !noalias !20
  %wide.load394 = load <2 x double>, ptr %112, align 8, !tbaa !5, !alias.scope !17, !noalias !20
  %113 = getelementptr inbounds double, ptr %3, i64 %index
  %114 = getelementptr inbounds i8, ptr %113, i64 16
  %wide.load395 = load <2 x double>, ptr %113, align 8, !tbaa !5, !alias.scope !23
  %wide.load396 = load <2 x double>, ptr %114, align 8, !tbaa !5, !alias.scope !23
  %115 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat, <2 x double> %wide.load395, <2 x double> %wide.load)
  %116 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat, <2 x double> %wide.load396, <2 x double> %wide.load394)
  %117 = getelementptr inbounds double, ptr %invariant.gep365, i64 %index
  %118 = getelementptr inbounds i8, ptr %117, i64 16
  %wide.load397 = load <2 x double>, ptr %117, align 8, !tbaa !5, !alias.scope !24
  %wide.load398 = load <2 x double>, ptr %118, align 8, !tbaa !5, !alias.scope !24
  %119 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat400, <2 x double> %wide.load397, <2 x double> %115)
  %120 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat400, <2 x double> %wide.load398, <2 x double> %116)
  store <2 x double> %119, ptr %111, align 8, !tbaa !5, !alias.scope !17, !noalias !20
  store <2 x double> %120, ptr %112, align 8, !tbaa !5, !alias.scope !17, !noalias !20
  %index.next = add nuw i64 %index, 4
  %121 = icmp eq i64 %index.next, %n.vec
  br i1 %121, label %middle.block, label %vector.body, !llvm.loop !25

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

scalar.ph.preheader:                              ; preds = %middle.block, %vector.memcheck, %100
  %indvars.iv294.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %100 ], [ %n.vec, %middle.block ]
  %xtraiter457 = and i64 %indvars.iv301, 1
  %lcmp.mod458.not = icmp eq i64 %xtraiter457, 0
  br i1 %lcmp.mod458.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader
  %gep364.prol = getelementptr inbounds double, ptr %invariant.gep363, i64 %indvars.iv294.ph
  %122 = load double, ptr %gep364.prol, align 8, !tbaa !5
  %123 = getelementptr inbounds double, ptr %3, i64 %indvars.iv294.ph
  %124 = load double, ptr %123, align 8, !tbaa !5
  %125 = tail call double @llvm.fmuladd.f64(double %106, double %124, double %122)
  %gep366.prol = getelementptr inbounds double, ptr %invariant.gep365, i64 %indvars.iv294.ph
  %126 = load double, ptr %gep366.prol, align 8, !tbaa !5
  %127 = tail call double @llvm.fmuladd.f64(double %107, double %126, double %125)
  store double %127, ptr %gep364.prol, align 8, !tbaa !5
  %indvars.iv.next295.prol = or disjoint i64 %indvars.iv294.ph, 1
  br label %scalar.ph.prol.loopexit

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv294.unr = phi i64 [ %indvars.iv294.ph, %scalar.ph.preheader ], [ %indvars.iv.next295.prol, %scalar.ph.prol ]
  %128 = icmp eq i64 %indvars.iv303, %indvars.iv294.ph
  br i1 %128, label %.loopexit439, label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv294 = phi i64 [ %indvars.iv.next295.1, %scalar.ph ], [ %indvars.iv294.unr, %scalar.ph.prol.loopexit ]
  %gep364 = getelementptr inbounds double, ptr %invariant.gep363, i64 %indvars.iv294
  %129 = load double, ptr %gep364, align 8, !tbaa !5
  %130 = getelementptr inbounds double, ptr %3, i64 %indvars.iv294
  %131 = load double, ptr %130, align 8, !tbaa !5
  %132 = tail call double @llvm.fmuladd.f64(double %106, double %131, double %129)
  %gep366 = getelementptr inbounds double, ptr %invariant.gep365, i64 %indvars.iv294
  %133 = load double, ptr %gep366, align 8, !tbaa !5
  %134 = tail call double @llvm.fmuladd.f64(double %107, double %133, double %132)
  store double %134, ptr %gep364, align 8, !tbaa !5
  %indvars.iv.next295 = add nuw nsw i64 %indvars.iv294, 1
  %gep364.1 = getelementptr inbounds double, ptr %invariant.gep363, i64 %indvars.iv.next295
  %135 = load double, ptr %gep364.1, align 8, !tbaa !5
  %136 = getelementptr inbounds double, ptr %3, i64 %indvars.iv.next295
  %137 = load double, ptr %136, align 8, !tbaa !5
  %138 = tail call double @llvm.fmuladd.f64(double %106, double %137, double %135)
  %gep366.1 = getelementptr inbounds double, ptr %invariant.gep365, i64 %indvars.iv.next295
  %139 = load double, ptr %gep366.1, align 8, !tbaa !5
  %140 = tail call double @llvm.fmuladd.f64(double %107, double %139, double %138)
  store double %140, ptr %gep364.1, align 8, !tbaa !5
  %indvars.iv.next295.1 = add nuw nsw i64 %indvars.iv294, 2
  %exitcond300.not.1 = icmp eq i64 %indvars.iv.next295.1, %indvars.iv301
  br i1 %exitcond300.not.1, label %.loopexit439, label %scalar.ph, !llvm.loop !28

.loopexit439:                                     ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block
  %indvars.iv.next304 = add nuw nsw i64 %indvars.iv303, 1
  %indvars.iv.next302 = add nuw i64 %indvars.iv301, 1
  %exitcond309.not = icmp eq i64 %indvars.iv.next304, %indvars.iv310
  br i1 %exitcond309.not, label %._crit_edge252, label %100, !llvm.loop !29

._crit_edge252:                                   ; preds = %.loopexit439, %47, %45
  %.sink = phi double [ 0.000000e+00, %45 ], [ 0.000000e+00, %47 ], [ %63, %.loopexit439 ]
  %141 = getelementptr inbounds double, ptr %2, i64 %indvars.iv310
  store double %.sink, ptr %141, align 8, !tbaa !5
  %142 = icmp sgt i64 %indvars.iv310.in, 2
  %indvar.next = add i32 %indvar, 1
  %indvar.next448 = add i64 %indvar447, 1
  br i1 %142, label %19, label %.preheader232, !llvm.loop !30

._crit_edge260:                                   ; preds = %4, %.preheader232
  %143 = sext i32 %5 to i64
  %144 = getelementptr inbounds double, ptr %3, i64 %143
  store double 0.000000e+00, ptr %144, align 8, !tbaa !5
  store double 0.000000e+00, ptr %2, align 8, !tbaa !5
  %145 = icmp sgt i32 %0, 0
  br i1 %145, label %.lr.ph268.preheader, label %._crit_edge269

.lr.ph268.preheader:                              ; preds = %._crit_edge260.thread, %._crit_edge260
  %146 = zext nneg i32 %0 to i64
  %invariant.gep484 = getelementptr i8, ptr %1, i64 -8
  %ident.check413.not = icmp eq i32 %0, 1
  %ident.check.not = icmp eq i32 %0, 1
  br label %.lr.ph268

.lr.ph268:                                        ; preds = %.lr.ph268.preheader, %.loopexit
  %indvars.iv336 = phi i64 [ 0, %.lr.ph268.preheader ], [ %indvars.iv.next337, %.loopexit ]
  %147 = add nsw i64 %indvars.iv336, -1
  %148 = shl i64 %indvars.iv336, 4
  %gep485 = getelementptr i8, ptr %invariant.gep484, i64 %148
  %149 = shl i64 %indvars.iv336, 3
  %scevgep416 = getelementptr i8, ptr %1, i64 %149
  %scevgep417 = getelementptr i8, ptr %1, i64 %148
  %indvars338 = trunc i64 %indvars.iv336 to i32
  %150 = getelementptr inbounds double, ptr %2, i64 %indvars.iv336
  %151 = load double, ptr %150, align 8, !tbaa !5
  %152 = fcmp oeq double %151, 0.000000e+00
  %.not = icmp eq i64 %indvars.iv336, 0
  %or.cond = or i1 %.not, %152
  %.pre342 = mul nuw nsw i64 %indvars.iv336, %146
  br i1 %or.cond, label %.loopexit231, label %.preheader230

.preheader230:                                    ; preds = %.lr.ph268
  %invariant.gep369 = getelementptr inbounds double, ptr %1, i64 %.pre342
  %invariant.gep375 = getelementptr inbounds double, ptr %1, i64 %indvars.iv336
  %xtraiter460 = and i64 %indvars.iv336, 3
  %153 = icmp ult i64 %147, 3
  %unroll_iter464 = and i64 %indvars.iv336, 9223372036854775804
  %lcmp.mod462.not = icmp eq i64 %xtraiter460, 0
  %min.iters.check423 = icmp ugt i64 %indvars.iv336, 3
  %or.cond440 = and i1 %min.iters.check423, %ident.check413.not
  %bound0418 = icmp ugt ptr %scevgep417, %1
  %bound1419 = icmp ult ptr %scevgep416, %gep485
  %found.conflict420 = and i1 %bound0418, %bound1419
  %n.vec426 = and i64 %indvars.iv336, 9223372036854775804
  %cmp.n437 = icmp eq i64 %indvars.iv336, %n.vec426
  %xtraiter466 = and i64 %indvars.iv336, 1
  %lcmp.mod467.not = icmp eq i64 %xtraiter466, 0
  br label %.preheader228

.preheader228:                                    ; preds = %.preheader230, %.loopexit438
  %indvars.iv325 = phi i64 [ 0, %.preheader230 ], [ %indvars.iv.next326, %.loopexit438 ]
  %invariant.gep371 = getelementptr inbounds double, ptr %1, i64 %indvars.iv325
  br i1 %153, label %.preheader.unr-lcssa, label %.preheader228.new

.preheader.unr-lcssa:                             ; preds = %.preheader228.new, %.preheader228
  %.lcssa.ph = phi double [ poison, %.preheader228 ], [ %186, %.preheader228.new ]
  %indvars.iv316.unr = phi i64 [ 0, %.preheader228 ], [ %indvars.iv.next317.3, %.preheader228.new ]
  %.3262.unr = phi double [ 0.000000e+00, %.preheader228 ], [ %186, %.preheader228.new ]
  br i1 %lcmp.mod462.not, label %.preheader, label %.epil.preheader459

.epil.preheader459:                               ; preds = %.preheader.unr-lcssa, %.epil.preheader459
  %indvars.iv316.epil = phi i64 [ %indvars.iv.next317.epil, %.epil.preheader459 ], [ %indvars.iv316.unr, %.preheader.unr-lcssa ]
  %.3262.epil = phi double [ %157, %.epil.preheader459 ], [ %.3262.unr, %.preheader.unr-lcssa ]
  %epil.iter461 = phi i64 [ %epil.iter461.next, %.epil.preheader459 ], [ 0, %.preheader.unr-lcssa ]
  %gep370.epil = getelementptr inbounds double, ptr %invariant.gep369, i64 %indvars.iv316.epil
  %154 = load double, ptr %gep370.epil, align 8, !tbaa !5
  %155 = mul nuw nsw i64 %indvars.iv316.epil, %146
  %gep372.epil = getelementptr inbounds double, ptr %invariant.gep371, i64 %155
  %156 = load double, ptr %gep372.epil, align 8, !tbaa !5
  %157 = tail call double @llvm.fmuladd.f64(double %154, double %156, double %.3262.epil)
  %indvars.iv.next317.epil = add nuw nsw i64 %indvars.iv316.epil, 1
  %epil.iter461.next = add i64 %epil.iter461, 1
  %epil.iter461.cmp.not = icmp eq i64 %epil.iter461.next, %xtraiter460
  br i1 %epil.iter461.cmp.not, label %.preheader, label %.epil.preheader459, !llvm.loop !31

.preheader:                                       ; preds = %.epil.preheader459, %.preheader.unr-lcssa
  %.lcssa = phi double [ %.lcssa.ph, %.preheader.unr-lcssa ], [ %157, %.epil.preheader459 ]
  %158 = fneg double %.lcssa
  %invariant.gep373 = getelementptr inbounds double, ptr %1, i64 %indvars.iv325
  %or.cond440.not = xor i1 %or.cond440, true
  %brmerge = or i1 %or.cond440.not, %found.conflict420
  br i1 %brmerge, label %scalar.ph422.preheader, label %vector.ph424

scalar.ph422.preheader:                           ; preds = %.preheader, %middle.block421
  %indvars.iv320.ph = phi i64 [ 0, %.preheader ], [ %n.vec426, %middle.block421 ]
  %.neg = or disjoint i64 %indvars.iv320.ph, 1
  br i1 %lcmp.mod467.not, label %scalar.ph422.prol.loopexit, label %scalar.ph422.prol

scalar.ph422.prol:                                ; preds = %scalar.ph422.preheader
  %159 = mul nuw nsw i64 %indvars.iv320.ph, %146
  %gep374.prol = getelementptr inbounds double, ptr %invariant.gep373, i64 %159
  %160 = load double, ptr %gep374.prol, align 8, !tbaa !5
  %gep376.prol = getelementptr inbounds double, ptr %invariant.gep375, i64 %159
  %161 = load double, ptr %gep376.prol, align 8, !tbaa !5
  %162 = tail call double @llvm.fmuladd.f64(double %158, double %161, double %160)
  store double %162, ptr %gep374.prol, align 8, !tbaa !5
  %indvars.iv.next321.prol = or disjoint i64 %indvars.iv320.ph, 1
  br label %scalar.ph422.prol.loopexit

scalar.ph422.prol.loopexit:                       ; preds = %scalar.ph422.prol, %scalar.ph422.preheader
  %indvars.iv320.unr = phi i64 [ %indvars.iv320.ph, %scalar.ph422.preheader ], [ %indvars.iv.next321.prol, %scalar.ph422.prol ]
  %163 = icmp eq i64 %indvars.iv336, %.neg
  br i1 %163, label %.loopexit438, label %scalar.ph422

vector.ph424:                                     ; preds = %.preheader
  %broadcast.splatinsert434 = insertelement <2 x double> poison, double %158, i64 0
  %broadcast.splat435 = shufflevector <2 x double> %broadcast.splatinsert434, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body428

vector.body428:                                   ; preds = %vector.body428, %vector.ph424
  %index429 = phi i64 [ 0, %vector.ph424 ], [ %index.next436, %vector.body428 ]
  %164 = getelementptr inbounds double, ptr %invariant.gep373, i64 %index429
  %165 = getelementptr inbounds i8, ptr %164, i64 16
  %wide.load430 = load <2 x double>, ptr %164, align 8, !tbaa !5, !alias.scope !32, !noalias !35
  %wide.load431 = load <2 x double>, ptr %165, align 8, !tbaa !5, !alias.scope !32, !noalias !35
  %166 = getelementptr inbounds double, ptr %invariant.gep375, i64 %index429
  %167 = getelementptr inbounds i8, ptr %166, i64 16
  %wide.load432 = load <2 x double>, ptr %166, align 8, !tbaa !5, !alias.scope !35
  %wide.load433 = load <2 x double>, ptr %167, align 8, !tbaa !5, !alias.scope !35
  %168 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat435, <2 x double> %wide.load432, <2 x double> %wide.load430)
  %169 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat435, <2 x double> %wide.load433, <2 x double> %wide.load431)
  store <2 x double> %168, ptr %164, align 8, !tbaa !5, !alias.scope !32, !noalias !35
  store <2 x double> %169, ptr %165, align 8, !tbaa !5, !alias.scope !32, !noalias !35
  %index.next436 = add nuw i64 %index429, 4
  %170 = icmp eq i64 %index.next436, %n.vec426
  br i1 %170, label %middle.block421, label %vector.body428, !llvm.loop !37

middle.block421:                                  ; preds = %vector.body428
  br i1 %cmp.n437, label %.loopexit438, label %scalar.ph422.preheader

.preheader228.new:                                ; preds = %.preheader228, %.preheader228.new
  %indvars.iv316 = phi i64 [ %indvars.iv.next317.3, %.preheader228.new ], [ 0, %.preheader228 ]
  %.3262 = phi double [ %186, %.preheader228.new ], [ 0.000000e+00, %.preheader228 ]
  %niter465 = phi i64 [ %niter465.next.3, %.preheader228.new ], [ 0, %.preheader228 ]
  %gep370 = getelementptr inbounds double, ptr %invariant.gep369, i64 %indvars.iv316
  %171 = load double, ptr %gep370, align 8, !tbaa !5
  %172 = mul nuw nsw i64 %indvars.iv316, %146
  %gep372 = getelementptr inbounds double, ptr %invariant.gep371, i64 %172
  %173 = load double, ptr %gep372, align 8, !tbaa !5
  %174 = tail call double @llvm.fmuladd.f64(double %171, double %173, double %.3262)
  %indvars.iv.next317 = or disjoint i64 %indvars.iv316, 1
  %gep370.1 = getelementptr inbounds double, ptr %invariant.gep369, i64 %indvars.iv.next317
  %175 = load double, ptr %gep370.1, align 8, !tbaa !5
  %176 = mul nuw nsw i64 %indvars.iv.next317, %146
  %gep372.1 = getelementptr inbounds double, ptr %invariant.gep371, i64 %176
  %177 = load double, ptr %gep372.1, align 8, !tbaa !5
  %178 = tail call double @llvm.fmuladd.f64(double %175, double %177, double %174)
  %indvars.iv.next317.1 = or disjoint i64 %indvars.iv316, 2
  %gep370.2 = getelementptr inbounds double, ptr %invariant.gep369, i64 %indvars.iv.next317.1
  %179 = load double, ptr %gep370.2, align 8, !tbaa !5
  %180 = mul nuw nsw i64 %indvars.iv.next317.1, %146
  %gep372.2 = getelementptr inbounds double, ptr %invariant.gep371, i64 %180
  %181 = load double, ptr %gep372.2, align 8, !tbaa !5
  %182 = tail call double @llvm.fmuladd.f64(double %179, double %181, double %178)
  %indvars.iv.next317.2 = or disjoint i64 %indvars.iv316, 3
  %gep370.3 = getelementptr inbounds double, ptr %invariant.gep369, i64 %indvars.iv.next317.2
  %183 = load double, ptr %gep370.3, align 8, !tbaa !5
  %184 = mul nuw nsw i64 %indvars.iv.next317.2, %146
  %gep372.3 = getelementptr inbounds double, ptr %invariant.gep371, i64 %184
  %185 = load double, ptr %gep372.3, align 8, !tbaa !5
  %186 = tail call double @llvm.fmuladd.f64(double %183, double %185, double %182)
  %indvars.iv.next317.3 = add nuw nsw i64 %indvars.iv316, 4
  %niter465.next.3 = add i64 %niter465, 4
  %niter465.ncmp.3 = icmp eq i64 %niter465.next.3, %unroll_iter464
  br i1 %niter465.ncmp.3, label %.preheader.unr-lcssa, label %.preheader228.new, !llvm.loop !38

scalar.ph422:                                     ; preds = %scalar.ph422.prol.loopexit, %scalar.ph422
  %indvars.iv320 = phi i64 [ %indvars.iv.next321.1, %scalar.ph422 ], [ %indvars.iv320.unr, %scalar.ph422.prol.loopexit ]
  %187 = mul nuw nsw i64 %indvars.iv320, %146
  %gep374 = getelementptr inbounds double, ptr %invariant.gep373, i64 %187
  %188 = load double, ptr %gep374, align 8, !tbaa !5
  %gep376 = getelementptr inbounds double, ptr %invariant.gep375, i64 %187
  %189 = load double, ptr %gep376, align 8, !tbaa !5
  %190 = tail call double @llvm.fmuladd.f64(double %158, double %189, double %188)
  store double %190, ptr %gep374, align 8, !tbaa !5
  %indvars.iv.next321 = add nuw nsw i64 %indvars.iv320, 1
  %191 = mul nuw nsw i64 %indvars.iv.next321, %146
  %gep374.1 = getelementptr inbounds double, ptr %invariant.gep373, i64 %191
  %192 = load double, ptr %gep374.1, align 8, !tbaa !5
  %gep376.1 = getelementptr inbounds double, ptr %invariant.gep375, i64 %191
  %193 = load double, ptr %gep376.1, align 8, !tbaa !5
  %194 = tail call double @llvm.fmuladd.f64(double %158, double %193, double %192)
  store double %194, ptr %gep374.1, align 8, !tbaa !5
  %indvars.iv.next321.1 = add nuw nsw i64 %indvars.iv320, 2
  %exitcond324.not.1 = icmp eq i64 %indvars.iv.next321.1, %indvars.iv336
  br i1 %exitcond324.not.1, label %.loopexit438, label %scalar.ph422, !llvm.loop !39

.loopexit438:                                     ; preds = %scalar.ph422.prol.loopexit, %scalar.ph422, %middle.block421
  %indvars.iv.next326 = add nuw nsw i64 %indvars.iv325, 1
  %exitcond329.not = icmp eq i64 %indvars.iv.next326, %indvars.iv336
  br i1 %exitcond329.not, label %.loopexit231.thread, label %.preheader228, !llvm.loop !40

.loopexit231.thread:                              ; preds = %.loopexit438
  %195 = mul nuw nsw i32 %indvars338, %0
  %196 = zext i32 %195 to i64
  %197 = getelementptr inbounds double, ptr %1, i64 %indvars.iv336
  %198 = getelementptr inbounds double, ptr %197, i64 %196
  %199 = load double, ptr %198, align 8, !tbaa !5
  store double %199, ptr %150, align 8, !tbaa !5
  store double 1.000000e+00, ptr %198, align 8, !tbaa !5
  br label %.preheader229.preheader

.loopexit231:                                     ; preds = %.lr.ph268
  %200 = mul nuw nsw i32 %indvars338, %0
  %201 = zext i32 %200 to i64
  %202 = getelementptr inbounds double, ptr %1, i64 %indvars.iv336
  %203 = getelementptr inbounds double, ptr %202, i64 %201
  %204 = load double, ptr %203, align 8, !tbaa !5
  store double %204, ptr %150, align 8, !tbaa !5
  store double 1.000000e+00, ptr %203, align 8, !tbaa !5
  br i1 %.not, label %.loopexit, label %.preheader229.preheader

.preheader229.preheader:                          ; preds = %.loopexit231.thread, %.loopexit231
  %invariant.gep377 = getelementptr double, ptr %1, i64 %.pre342
  %invariant.gep379 = getelementptr inbounds double, ptr %1, i64 %indvars.iv336
  %min.iters.check403 = icmp ugt i64 %indvars.iv336, 3
  %or.cond441 = and i1 %min.iters.check403, %ident.check.not
  br i1 %or.cond441, label %vector.ph404, label %.preheader229.preheader442

vector.ph404:                                     ; preds = %.preheader229.preheader
  %n.vec406 = and i64 %indvars.iv336, 9223372036854775804
  br label %vector.body408

vector.body408:                                   ; preds = %vector.body408, %vector.ph404
  %index409 = phi i64 [ 0, %vector.ph404 ], [ %index.next410, %vector.body408 ]
  %205 = getelementptr double, ptr %invariant.gep377, i64 %index409
  %206 = getelementptr i8, ptr %205, i64 16
  store <2 x double> zeroinitializer, ptr %205, align 8, !tbaa !5
  store <2 x double> zeroinitializer, ptr %206, align 8, !tbaa !5
  %207 = getelementptr inbounds double, ptr %invariant.gep379, i64 %index409
  %208 = getelementptr inbounds i8, ptr %207, i64 16
  store <2 x double> zeroinitializer, ptr %207, align 8, !tbaa !5
  store <2 x double> zeroinitializer, ptr %208, align 8, !tbaa !5
  %index.next410 = add nuw i64 %index409, 4
  %209 = icmp eq i64 %index.next410, %n.vec406
  br i1 %209, label %middle.block401, label %vector.body408, !llvm.loop !41

middle.block401:                                  ; preds = %vector.body408
  %cmp.n411 = icmp eq i64 %indvars.iv336, %n.vec406
  br i1 %cmp.n411, label %.loopexit, label %.preheader229.preheader442

.preheader229.preheader442:                       ; preds = %middle.block401, %.preheader229.preheader
  %indvars.iv331.ph = phi i64 [ 0, %.preheader229.preheader ], [ %n.vec406, %middle.block401 ]
  %xtraiter468 = and i64 %indvars.iv336, 3
  %lcmp.mod469.not = icmp eq i64 %xtraiter468, 0
  br i1 %lcmp.mod469.not, label %.preheader229.prol.loopexit, label %.preheader229.prol

.preheader229.prol:                               ; preds = %.preheader229.preheader442, %.preheader229.prol
  %indvars.iv331.prol = phi i64 [ %indvars.iv.next332.prol, %.preheader229.prol ], [ %indvars.iv331.ph, %.preheader229.preheader442 ]
  %prol.iter = phi i64 [ %prol.iter.next, %.preheader229.prol ], [ 0, %.preheader229.preheader442 ]
  %gep378.prol = getelementptr double, ptr %invariant.gep377, i64 %indvars.iv331.prol
  store double 0.000000e+00, ptr %gep378.prol, align 8, !tbaa !5
  %210 = mul nuw nsw i64 %indvars.iv331.prol, %146
  %gep380.prol = getelementptr inbounds double, ptr %invariant.gep379, i64 %210
  store double 0.000000e+00, ptr %gep380.prol, align 8, !tbaa !5
  %indvars.iv.next332.prol = add nuw nsw i64 %indvars.iv331.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter468
  br i1 %prol.iter.cmp.not, label %.preheader229.prol.loopexit, label %.preheader229.prol, !llvm.loop !42

.preheader229.prol.loopexit:                      ; preds = %.preheader229.prol, %.preheader229.preheader442
  %indvars.iv331.unr = phi i64 [ %indvars.iv331.ph, %.preheader229.preheader442 ], [ %indvars.iv.next332.prol, %.preheader229.prol ]
  %211 = sub nsw i64 %indvars.iv331.ph, %indvars.iv336
  %212 = icmp ugt i64 %211, -4
  br i1 %212, label %.loopexit, label %.preheader229

.preheader229:                                    ; preds = %.preheader229.prol.loopexit, %.preheader229
  %indvars.iv331 = phi i64 [ %indvars.iv.next332.3, %.preheader229 ], [ %indvars.iv331.unr, %.preheader229.prol.loopexit ]
  %gep378 = getelementptr double, ptr %invariant.gep377, i64 %indvars.iv331
  store double 0.000000e+00, ptr %gep378, align 8, !tbaa !5
  %213 = mul nuw nsw i64 %indvars.iv331, %146
  %gep380 = getelementptr inbounds double, ptr %invariant.gep379, i64 %213
  store double 0.000000e+00, ptr %gep380, align 8, !tbaa !5
  %indvars.iv.next332 = add nuw nsw i64 %indvars.iv331, 1
  %gep378.1 = getelementptr double, ptr %invariant.gep377, i64 %indvars.iv.next332
  store double 0.000000e+00, ptr %gep378.1, align 8, !tbaa !5
  %214 = mul nuw nsw i64 %indvars.iv.next332, %146
  %gep380.1 = getelementptr inbounds double, ptr %invariant.gep379, i64 %214
  store double 0.000000e+00, ptr %gep380.1, align 8, !tbaa !5
  %indvars.iv.next332.1 = add nuw nsw i64 %indvars.iv331, 2
  %gep378.2 = getelementptr double, ptr %invariant.gep377, i64 %indvars.iv.next332.1
  store double 0.000000e+00, ptr %gep378.2, align 8, !tbaa !5
  %215 = mul nuw nsw i64 %indvars.iv.next332.1, %146
  %gep380.2 = getelementptr inbounds double, ptr %invariant.gep379, i64 %215
  store double 0.000000e+00, ptr %gep380.2, align 8, !tbaa !5
  %indvars.iv.next332.2 = add nuw nsw i64 %indvars.iv331, 3
  %gep378.3 = getelementptr double, ptr %invariant.gep377, i64 %indvars.iv.next332.2
  store double 0.000000e+00, ptr %gep378.3, align 8, !tbaa !5
  %216 = mul nuw nsw i64 %indvars.iv.next332.2, %146
  %gep380.3 = getelementptr inbounds double, ptr %invariant.gep379, i64 %216
  store double 0.000000e+00, ptr %gep380.3, align 8, !tbaa !5
  %indvars.iv.next332.3 = add nuw nsw i64 %indvars.iv331, 4
  %exitcond335.not.3 = icmp eq i64 %indvars.iv.next332.3, %indvars.iv336
  br i1 %exitcond335.not.3, label %.loopexit, label %.preheader229, !llvm.loop !43

.loopexit:                                        ; preds = %.preheader229.prol.loopexit, %.preheader229, %middle.block401, %.loopexit231
  %indvars.iv.next337 = add nuw nsw i64 %indvars.iv336, 1
  %exitcond340.not = icmp eq i64 %indvars.iv.next337, %146
  br i1 %exitcond340.not, label %._crit_edge269, label %.lr.ph268, !llvm.loop !44

._crit_edge269:                                   ; preds = %.loopexit, %._crit_edge260
  ret void
}

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @sqrt(double noundef) local_unnamed_addr #2

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memmove.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg) #3

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"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 = !{!18}
!18 = distinct !{!18, !19}
!19 = distinct !{!19, !"LVerDomain"}
!20 = !{!21, !22}
!21 = distinct !{!21, !19}
!22 = distinct !{!22, !19}
!23 = !{!21}
!24 = !{!22}
!25 = distinct !{!25, !10, !26, !27}
!26 = !{!"llvm.loop.isvectorized", i32 1}
!27 = !{!"llvm.loop.unroll.runtime.disable"}
!28 = distinct !{!28, !10, !26}
!29 = distinct !{!29, !10}
!30 = distinct !{!30, !10}
!31 = distinct !{!31, !12}
!32 = !{!33}
!33 = distinct !{!33, !34}
!34 = distinct !{!34, !"LVerDomain"}
!35 = !{!36}
!36 = distinct !{!36, !34}
!37 = distinct !{!37, !10, !26, !27}
!38 = distinct !{!38, !10}
!39 = distinct !{!39, !10, !26}
!40 = distinct !{!40, !10}
!41 = distinct !{!41, !10, !26, !27}
!42 = distinct !{!42, !12}
!43 = distinct !{!43, !10, !26}
!44 = distinct !{!44, !10}


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