; LLVM IR from jingweizhanghuai/Morn :: src/math (morn_matrix)

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

@.str = external hidden unnamed_addr constant [78 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [19 x i8], align 1
@__FUNCTION__.m_VectorScale = external hidden unnamed_addr constant [14 x i8], align 1

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

declare void @m_Exception(i32 noundef, i32 noundef, ptr noundef, i32 noundef, ptr noundef, ptr noundef, ...) #1

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

; Function Attrs: nounwind uwtable
declare dso_local void @VectorRedefine(ptr noundef, i32 noundef, ptr noundef) #2

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

; Function Attrs: nounwind uwtable
define dso_local void @m_VectorScale(ptr noundef %0, ptr noundef %1, float noundef %2, float noundef %3) #2 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca float, align 4
  %8 = alloca float, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store float %2, ptr %7, align 4, !tbaa !9
  store float %3, ptr %8, align 4, !tbaa !9
  %15 = load ptr, ptr %6, align 8, !tbaa !5
  %16 = load ptr, ptr %5, align 8, !tbaa !5
  %17 = icmp ne ptr %15, %16
  br i1 %17, label %18, label %52

18:                                               ; preds = %4
  br label %19

19:                                               ; preds = %18
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  store i32 2, ptr %9, align 4, !tbaa !11
  %20 = load i32, ptr %9, align 4, !tbaa !11
  %21 = icmp eq i32 %20, 1
  br i1 %21, label %22, label %31

22:                                               ; preds = %19
  %23 = load ptr, ptr %6, align 8, !tbaa !5
  %24 = load ptr, ptr %5, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.MVector, ptr %24, i32 0, i32 0
  %26 = load i32, ptr %25, align 8, !tbaa !13
  %27 = add nsw i32 %26, 0
  %28 = load ptr, ptr %6, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.MVector, ptr %28, i32 0, i32 1
  %30 = load ptr, ptr %29, align 8, !tbaa !15
  call void @VectorRedefine(ptr noundef %23, i32 noundef %27, ptr noundef %30)
  br label %50

31:                                               ; preds = %19
  %32 = load i32, ptr %9, align 4, !tbaa !11
  %33 = icmp eq i32 %32, 2
  br i1 %33, label %34, label %40

34:                                               ; preds = %31
  %35 = load ptr, ptr %6, align 8, !tbaa !5
  %36 = load ptr, ptr %5, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.MVector, ptr %36, i32 0, i32 0
  %38 = load i32, ptr %37, align 8, !tbaa !13
  %39 = add nsw i32 %38, 0
  call void @VectorRedefine(ptr noundef %35, i32 noundef %39, ptr noundef null)
  br label %49

40:                                               ; preds = %31
  br label %41

41:                                               ; preds = %40
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  store i32 1, ptr %10, align 4, !tbaa !11
  %42 = load i32, ptr %10, align 4, !tbaa !11
  %43 = icmp ne i32 %42, 0
  br i1 %43, label %44, label %46

44:                                               ; preds = %41
  %45 = load i32, ptr %10, align 4, !tbaa !11
  call void (i32, i32, ptr, i32, ptr, ptr, ...) @m_Exception(i32 noundef %45, i32 noundef -1, ptr noundef @.str, i32 noundef 355, ptr noundef @__FUNCTION__.m_VectorScale, ptr noundef @.str.11)
  br label %46

46:                                               ; preds = %44, %41
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  br label %47

47:                                               ; preds = %46
  br label %48

48:                                               ; preds = %47
  br label %49

49:                                               ; preds = %48, %34
  br label %50

50:                                               ; preds = %49, %22
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  br label %51

51:                                               ; preds = %50
  br label %52

52:                                               ; preds = %51, %4
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #4
  %53 = load ptr, ptr %5, align 8, !tbaa !5
  %54 = getelementptr inbounds %struct.MVector, ptr %53, i32 0, i32 1
  %55 = load ptr, ptr %54, align 8, !tbaa !15
  store ptr %55, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #4
  %56 = load ptr, ptr %6, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.MVector, ptr %56, i32 0, i32 1
  %58 = load ptr, ptr %57, align 8, !tbaa !15
  store ptr %58, ptr %12, align 8, !tbaa !5
  %59 = load float, ptr %8, align 4, !tbaa !9
  %60 = fcmp une float %59, 0.000000e+00
  br i1 %60, label %61, label %151

61:                                               ; preds = %52
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #4
  store i32 0, ptr %13, align 4, !tbaa !11
  br label %62

62:                                               ; preds = %124, %61
  %63 = load i32, ptr %13, align 4, !tbaa !11
  %64 = load ptr, ptr %5, align 8, !tbaa !5
  %65 = getelementptr inbounds %struct.MVector, ptr %64, i32 0, i32 0
  %66 = load i32, ptr %65, align 8, !tbaa !13
  %67 = sub nsw i32 %66, 3
  %68 = icmp slt i32 %63, %67
  br i1 %68, label %69, label %127

69:                                               ; preds = %62
  %70 = load ptr, ptr %11, align 8, !tbaa !5
  %71 = load i32, ptr %13, align 4, !tbaa !11
  %72 = sext i32 %71 to i64
  %73 = getelementptr inbounds float, ptr %70, i64 %72
  %74 = load float, ptr %73, align 4, !tbaa !9
  %75 = load float, ptr %7, align 4, !tbaa !9
  %76 = load float, ptr %8, align 4, !tbaa !9
  %77 = call float @llvm.fmuladd.f32(float %74, float %75, float %76)
  %78 = load ptr, ptr %12, align 8, !tbaa !5
  %79 = load i32, ptr %13, align 4, !tbaa !11
  %80 = sext i32 %79 to i64
  %81 = getelementptr inbounds float, ptr %78, i64 %80
  store float %77, ptr %81, align 4, !tbaa !9
  %82 = load ptr, ptr %11, align 8, !tbaa !5
  %83 = load i32, ptr %13, align 4, !tbaa !11
  %84 = add nsw i32 %83, 1
  %85 = sext i32 %84 to i64
  %86 = getelementptr inbounds float, ptr %82, i64 %85
  %87 = load float, ptr %86, align 4, !tbaa !9
  %88 = load float, ptr %7, align 4, !tbaa !9
  %89 = load float, ptr %8, align 4, !tbaa !9
  %90 = call float @llvm.fmuladd.f32(float %87, float %88, float %89)
  %91 = load ptr, ptr %12, align 8, !tbaa !5
  %92 = load i32, ptr %13, align 4, !tbaa !11
  %93 = add nsw i32 %92, 1
  %94 = sext i32 %93 to i64
  %95 = getelementptr inbounds float, ptr %91, i64 %94
  store float %90, ptr %95, align 4, !tbaa !9
  %96 = load ptr, ptr %11, align 8, !tbaa !5
  %97 = load i32, ptr %13, align 4, !tbaa !11
  %98 = add nsw i32 %97, 2
  %99 = sext i32 %98 to i64
  %100 = getelementptr inbounds float, ptr %96, i64 %99
  %101 = load float, ptr %100, align 4, !tbaa !9
  %102 = load float, ptr %7, align 4, !tbaa !9
  %103 = load float, ptr %8, align 4, !tbaa !9
  %104 = call float @llvm.fmuladd.f32(float %101, float %102, float %103)
  %105 = load ptr, ptr %12, align 8, !tbaa !5
  %106 = load i32, ptr %13, align 4, !tbaa !11
  %107 = add nsw i32 %106, 2
  %108 = sext i32 %107 to i64
  %109 = getelementptr inbounds float, ptr %105, i64 %108
  store float %104, ptr %109, align 4, !tbaa !9
  %110 = load ptr, ptr %11, align 8, !tbaa !5
  %111 = load i32, ptr %13, align 4, !tbaa !11
  %112 = add nsw i32 %111, 3
  %113 = sext i32 %112 to i64
  %114 = getelementptr inbounds float, ptr %110, i64 %113
  %115 = load float, ptr %114, align 4, !tbaa !9
  %116 = load float, ptr %7, align 4, !tbaa !9
  %117 = load float, ptr %8, align 4, !tbaa !9
  %118 = call float @llvm.fmuladd.f32(float %115, float %116, float %117)
  %119 = load ptr, ptr %12, align 8, !tbaa !5
  %120 = load i32, ptr %13, align 4, !tbaa !11
  %121 = add nsw i32 %120, 3
  %122 = sext i32 %121 to i64
  %123 = getelementptr inbounds float, ptr %119, i64 %122
  store float %118, ptr %123, align 4, !tbaa !9
  br label %124

124:                                              ; preds = %69
  %125 = load i32, ptr %13, align 4, !tbaa !11
  %126 = add nsw i32 %125, 4
  store i32 %126, ptr %13, align 4, !tbaa !11
  br label %62, !llvm.loop !16

127:                                              ; preds = %62
  br label %128

128:                                              ; preds = %147, %127
  %129 = load i32, ptr %13, align 4, !tbaa !11
  %130 = load ptr, ptr %5, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.MVector, ptr %130, i32 0, i32 0
  %132 = load i32, ptr %131, align 8, !tbaa !13
  %133 = icmp slt i32 %129, %132
  br i1 %133, label %134, label %150

134:                                              ; preds = %128
  %135 = load ptr, ptr %11, align 8, !tbaa !5
  %136 = load i32, ptr %13, align 4, !tbaa !11
  %137 = sext i32 %136 to i64
  %138 = getelementptr inbounds float, ptr %135, i64 %137
  %139 = load float, ptr %138, align 4, !tbaa !9
  %140 = load float, ptr %7, align 4, !tbaa !9
  %141 = load float, ptr %8, align 4, !tbaa !9
  %142 = call float @llvm.fmuladd.f32(float %139, float %140, float %141)
  %143 = load ptr, ptr %12, align 8, !tbaa !5
  %144 = load i32, ptr %13, align 4, !tbaa !11
  %145 = sext i32 %144 to i64
  %146 = getelementptr inbounds float, ptr %143, i64 %145
  store float %142, ptr %146, align 4, !tbaa !9
  br label %147

147:                                              ; preds = %134
  %148 = load i32, ptr %13, align 4, !tbaa !11
  %149 = add nsw i32 %148, 1
  store i32 %149, ptr %13, align 4, !tbaa !11
  br label %128, !llvm.loop !18

150:                                              ; preds = %128
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  br label %236

151:                                              ; preds = %52
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #4
  store i32 0, ptr %14, align 4, !tbaa !11
  br label %152

152:                                              ; preds = %210, %151
  %153 = load i32, ptr %14, align 4, !tbaa !11
  %154 = load ptr, ptr %5, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.MVector, ptr %154, i32 0, i32 0
  %156 = load i32, ptr %155, align 8, !tbaa !13
  %157 = sub nsw i32 %156, 3
  %158 = icmp slt i32 %153, %157
  br i1 %158, label %159, label %213

159:                                              ; preds = %152
  %160 = load ptr, ptr %11, align 8, !tbaa !5
  %161 = load i32, ptr %14, align 4, !tbaa !11
  %162 = sext i32 %161 to i64
  %163 = getelementptr inbounds float, ptr %160, i64 %162
  %164 = load float, ptr %163, align 4, !tbaa !9
  %165 = load float, ptr %7, align 4, !tbaa !9
  %166 = fmul float %164, %165
  %167 = load ptr, ptr %12, align 8, !tbaa !5
  %168 = load i32, ptr %14, align 4, !tbaa !11
  %169 = sext i32 %168 to i64
  %170 = getelementptr inbounds float, ptr %167, i64 %169
  store float %166, ptr %170, align 4, !tbaa !9
  %171 = load ptr, ptr %11, align 8, !tbaa !5
  %172 = load i32, ptr %14, align 4, !tbaa !11
  %173 = add nsw i32 %172, 1
  %174 = sext i32 %173 to i64
  %175 = getelementptr inbounds float, ptr %171, i64 %174
  %176 = load float, ptr %175, align 4, !tbaa !9
  %177 = load float, ptr %7, align 4, !tbaa !9
  %178 = fmul float %176, %177
  %179 = load ptr, ptr %12, align 8, !tbaa !5
  %180 = load i32, ptr %14, align 4, !tbaa !11
  %181 = add nsw i32 %180, 1
  %182 = sext i32 %181 to i64
  %183 = getelementptr inbounds float, ptr %179, i64 %182
  store float %178, ptr %183, align 4, !tbaa !9
  %184 = load ptr, ptr %11, align 8, !tbaa !5
  %185 = load i32, ptr %14, align 4, !tbaa !11
  %186 = add nsw i32 %185, 2
  %187 = sext i32 %186 to i64
  %188 = getelementptr inbounds float, ptr %184, i64 %187
  %189 = load float, ptr %188, align 4, !tbaa !9
  %190 = load float, ptr %7, align 4, !tbaa !9
  %191 = fmul float %189, %190
  %192 = load ptr, ptr %12, align 8, !tbaa !5
  %193 = load i32, ptr %14, align 4, !tbaa !11
  %194 = add nsw i32 %193, 2
  %195 = sext i32 %194 to i64
  %196 = getelementptr inbounds float, ptr %192, i64 %195
  store float %191, ptr %196, align 4, !tbaa !9
  %197 = load ptr, ptr %11, align 8, !tbaa !5
  %198 = load i32, ptr %14, align 4, !tbaa !11
  %199 = add nsw i32 %198, 3
  %200 = sext i32 %199 to i64
  %201 = getelementptr inbounds float, ptr %197, i64 %200
  %202 = load float, ptr %201, align 4, !tbaa !9
  %203 = load float, ptr %7, align 4, !tbaa !9
  %204 = fmul float %202, %203
  %205 = load ptr, ptr %12, align 8, !tbaa !5
  %206 = load i32, ptr %14, align 4, !tbaa !11
  %207 = add nsw i32 %206, 3
  %208 = sext i32 %207 to i64
  %209 = getelementptr inbounds float, ptr %205, i64 %208
  store float %204, ptr %209, align 4, !tbaa !9
  br label %210

210:                                              ; preds = %159
  %211 = load i32, ptr %14, align 4, !tbaa !11
  %212 = add nsw i32 %211, 4
  store i32 %212, ptr %14, align 4, !tbaa !11
  br label %152, !llvm.loop !19

213:                                              ; preds = %152
  br label %214

214:                                              ; preds = %232, %213
  %215 = load i32, ptr %14, align 4, !tbaa !11
  %216 = load ptr, ptr %5, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct.MVector, ptr %216, i32 0, i32 0
  %218 = load i32, ptr %217, align 8, !tbaa !13
  %219 = icmp slt i32 %215, %218
  br i1 %219, label %220, label %235

220:                                              ; preds = %214
  %221 = load ptr, ptr %11, align 8, !tbaa !5
  %222 = load i32, ptr %14, align 4, !tbaa !11
  %223 = sext i32 %222 to i64
  %224 = getelementptr inbounds float, ptr %221, i64 %223
  %225 = load float, ptr %224, align 4, !tbaa !9
  %226 = load float, ptr %7, align 4, !tbaa !9
  %227 = fmul float %225, %226
  %228 = load ptr, ptr %12, align 8, !tbaa !5
  %229 = load i32, ptr %14, align 4, !tbaa !11
  %230 = sext i32 %229 to i64
  %231 = getelementptr inbounds float, ptr %228, i64 %230
  store float %227, ptr %231, align 4, !tbaa !9
  br label %232

232:                                              ; preds = %220
  %233 = load i32, ptr %14, align 4, !tbaa !11
  %234 = add nsw i32 %233, 1
  store i32 %234, ptr %14, align 4, !tbaa !11
  br label %214, !llvm.loop !20

235:                                              ; preds = %214
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  br label %236

236:                                              ; preds = %235, %150
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #4
  ret void
}

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

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

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


; 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
declare dso_local void @VectorRedefine(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
define dso_local void @m_VectorScale(ptr noundef readonly %0, ptr noundef %1, float noundef %2, float noundef %3) local_unnamed_addr #0 {
  %.not = icmp eq ptr %1, %0
  br i1 %.not, label %7, label %5

5:                                                ; preds = %4
  %6 = load i32, ptr %0, align 8, !tbaa !5
  tail call void @VectorRedefine(ptr noundef %1, i32 noundef %6, ptr noundef null)
  br label %7

7:                                                ; preds = %5, %4
  %8 = getelementptr inbounds i8, ptr %0, i64 8
  %9 = load ptr, ptr %8, align 8, !tbaa !11
  %10 = ptrtoint ptr %9 to i64
  %11 = getelementptr inbounds i8, ptr %1, i64 8
  %12 = load ptr, ptr %11, align 8, !tbaa !11
  %13 = ptrtoint ptr %12 to i64
  %14 = fcmp une float %3, 0.000000e+00
  %15 = load i32, ptr %0, align 8, !tbaa !5
  %16 = icmp sgt i32 %15, 3
  br i1 %14, label %.preheader85, label %.preheader88

.preheader88:                                     ; preds = %7
  br i1 %16, label %.lr.ph.preheader, label %.preheader86

.lr.ph.preheader:                                 ; preds = %.preheader88
  %17 = add nsw i32 %15, -3
  %18 = zext nneg i32 %17 to i64
  %umax117 = tail call i64 @llvm.umax.i64(i64 %18, i64 4)
  %19 = add nsw i64 %umax117, -1
  %20 = lshr i64 %19, 2
  %21 = add nuw nsw i64 %20, 1
  %min.iters.check = icmp ult i32 %17, 13
  br i1 %min.iters.check, label %.lr.ph.preheader188, label %vector.memcheck

.lr.ph.preheader188:                              ; preds = %middle.block, %vector.memcheck, %.lr.ph.preheader
  %indvars.iv.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph.preheader ], [ %ind.end, %middle.block ]
  br label %.lr.ph

vector.memcheck:                                  ; preds = %.lr.ph.preheader
  %22 = shl nuw nsw i64 %18, 2
  %23 = add nsw i64 %22, -4
  %24 = and i64 %23, -16
  %25 = add nuw nsw i64 %24, 16
  %scevgep = getelementptr i8, ptr %12, i64 %25
  %scevgep116 = getelementptr i8, ptr %9, i64 %25
  %bound0 = icmp ult ptr %12, %scevgep116
  %bound1 = icmp ult ptr %9, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph.preheader188, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %21, 9223372036854775804
  %ind.end = shl i64 %n.vec, 2
  %broadcast.splatinsert = insertelement <4 x float> poison, float %2, i64 0
  %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer
  %invariant.gep = getelementptr i8, ptr %12, i64 -12
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = shl i64 %index, 2
  %26 = or disjoint i64 %offset.idx, 4
  %27 = or disjoint i64 %offset.idx, 8
  %28 = or disjoint i64 %offset.idx, 12
  %29 = getelementptr inbounds float, ptr %9, i64 %offset.idx
  %30 = getelementptr inbounds float, ptr %9, i64 %26
  %31 = getelementptr inbounds float, ptr %9, i64 %27
  %32 = getelementptr inbounds float, ptr %9, i64 %28
  %33 = load float, ptr %29, align 4, !tbaa !12, !alias.scope !14
  %34 = load float, ptr %30, align 4, !tbaa !12, !alias.scope !14
  %35 = load float, ptr %31, align 4, !tbaa !12, !alias.scope !14
  %36 = load float, ptr %32, align 4, !tbaa !12, !alias.scope !14
  %37 = insertelement <4 x float> poison, float %33, i64 0
  %38 = insertelement <4 x float> %37, float %34, i64 1
  %39 = insertelement <4 x float> %38, float %35, i64 2
  %40 = insertelement <4 x float> %39, float %36, i64 3
  %41 = fmul <4 x float> %40, %broadcast.splat
  %42 = or disjoint i64 %offset.idx, 1
  %43 = or disjoint i64 %offset.idx, 5
  %44 = or disjoint i64 %offset.idx, 9
  %45 = or disjoint i64 %offset.idx, 13
  %46 = getelementptr inbounds float, ptr %9, i64 %42
  %47 = getelementptr inbounds float, ptr %9, i64 %43
  %48 = getelementptr inbounds float, ptr %9, i64 %44
  %49 = getelementptr inbounds float, ptr %9, i64 %45
  %50 = load float, ptr %46, align 4, !tbaa !12, !alias.scope !14
  %51 = load float, ptr %47, align 4, !tbaa !12, !alias.scope !14
  %52 = load float, ptr %48, align 4, !tbaa !12, !alias.scope !14
  %53 = load float, ptr %49, align 4, !tbaa !12, !alias.scope !14
  %54 = insertelement <4 x float> poison, float %50, i64 0
  %55 = insertelement <4 x float> %54, float %51, i64 1
  %56 = insertelement <4 x float> %55, float %52, i64 2
  %57 = insertelement <4 x float> %56, float %53, i64 3
  %58 = fmul <4 x float> %57, %broadcast.splat
  %59 = or disjoint i64 %offset.idx, 2
  %60 = or disjoint i64 %offset.idx, 6
  %61 = or disjoint i64 %offset.idx, 10
  %62 = or disjoint i64 %offset.idx, 14
  %63 = getelementptr inbounds float, ptr %9, i64 %59
  %64 = getelementptr inbounds float, ptr %9, i64 %60
  %65 = getelementptr inbounds float, ptr %9, i64 %61
  %66 = getelementptr inbounds float, ptr %9, i64 %62
  %67 = load float, ptr %63, align 4, !tbaa !12, !alias.scope !14
  %68 = load float, ptr %64, align 4, !tbaa !12, !alias.scope !14
  %69 = load float, ptr %65, align 4, !tbaa !12, !alias.scope !14
  %70 = load float, ptr %66, align 4, !tbaa !12, !alias.scope !14
  %71 = insertelement <4 x float> poison, float %67, i64 0
  %72 = insertelement <4 x float> %71, float %68, i64 1
  %73 = insertelement <4 x float> %72, float %69, i64 2
  %74 = insertelement <4 x float> %73, float %70, i64 3
  %75 = fmul <4 x float> %74, %broadcast.splat
  %76 = or disjoint i64 %offset.idx, 3
  %77 = or disjoint i64 %offset.idx, 7
  %78 = or disjoint i64 %offset.idx, 11
  %79 = or disjoint i64 %offset.idx, 15
  %80 = getelementptr inbounds float, ptr %9, i64 %76
  %81 = getelementptr inbounds float, ptr %9, i64 %77
  %82 = getelementptr inbounds float, ptr %9, i64 %78
  %83 = getelementptr inbounds float, ptr %9, i64 %79
  %84 = load float, ptr %80, align 4, !tbaa !12, !alias.scope !14
  %85 = load float, ptr %81, align 4, !tbaa !12, !alias.scope !14
  %86 = load float, ptr %82, align 4, !tbaa !12, !alias.scope !14
  %87 = load float, ptr %83, align 4, !tbaa !12, !alias.scope !14
  %88 = insertelement <4 x float> poison, float %84, i64 0
  %89 = insertelement <4 x float> %88, float %85, i64 1
  %90 = insertelement <4 x float> %89, float %86, i64 2
  %91 = insertelement <4 x float> %90, float %87, i64 3
  %92 = fmul <4 x float> %91, %broadcast.splat
  %gep = getelementptr float, ptr %invariant.gep, i64 %76
  %93 = shufflevector <4 x float> %41, <4 x float> %58, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
  %94 = shufflevector <4 x float> %75, <4 x float> %92, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
  %interleaved.vec = shufflevector <8 x float> %93, <8 x float> %94, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>
  store <16 x float> %interleaved.vec, ptr %gep, align 4, !tbaa !12
  %index.next = add nuw i64 %index, 4
  %95 = icmp eq i64 %index.next, %n.vec
  br i1 %95, label %middle.block, label %vector.body, !llvm.loop !17

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %21, %n.vec
  br i1 %cmp.n, label %.preheader86.loopexit, label %.lr.ph.preheader188

.preheader85:                                     ; preds = %7
  br i1 %16, label %.lr.ph95.preheader, label %.preheader

.lr.ph95.preheader:                               ; preds = %.preheader85
  %96 = add nsw i32 %15, -3
  %97 = zext nneg i32 %96 to i64
  %umax142 = tail call i64 @llvm.umax.i64(i64 %97, i64 4)
  %98 = add nsw i64 %umax142, -1
  %99 = lshr i64 %98, 2
  %100 = add nuw nsw i64 %99, 1
  %min.iters.check145 = icmp ult i32 %96, 13
  br i1 %min.iters.check145, label %.lr.ph95.preheader184, label %vector.memcheck135

.lr.ph95.preheader184:                            ; preds = %middle.block143, %vector.memcheck135, %.lr.ph95.preheader
  %indvars.iv106.ph = phi i64 [ 0, %vector.memcheck135 ], [ 0, %.lr.ph95.preheader ], [ %ind.end149, %middle.block143 ]
  br label %.lr.ph95

vector.memcheck135:                               ; preds = %.lr.ph95.preheader
  %101 = shl nuw nsw i64 %97, 2
  %102 = add nsw i64 %101, -4
  %103 = and i64 %102, -16
  %104 = add nuw nsw i64 %103, 16
  %scevgep137 = getelementptr i8, ptr %12, i64 %104
  %scevgep138 = getelementptr i8, ptr %9, i64 %104
  %bound0139 = icmp ult ptr %12, %scevgep138
  %bound1140 = icmp ult ptr %9, %scevgep137
  %found.conflict141 = and i1 %bound0139, %bound1140
  br i1 %found.conflict141, label %.lr.ph95.preheader184, label %vector.ph146

vector.ph146:                                     ; preds = %vector.memcheck135
  %n.vec148 = and i64 %100, 9223372036854775804
  %ind.end149 = shl i64 %n.vec148, 2
  %broadcast.splatinsert154 = insertelement <4 x float> poison, float %2, i64 0
  %broadcast.splat155 = shufflevector <4 x float> %broadcast.splatinsert154, <4 x float> poison, <4 x i32> zeroinitializer
  %broadcast.splatinsert156 = insertelement <4 x float> poison, float %3, i64 0
  %broadcast.splat157 = shufflevector <4 x float> %broadcast.splatinsert156, <4 x float> poison, <4 x i32> zeroinitializer
  %invariant.gep195 = getelementptr i8, ptr %12, i64 -12
  br label %vector.body151

vector.body151:                                   ; preds = %vector.body151, %vector.ph146
  %index152 = phi i64 [ 0, %vector.ph146 ], [ %index.next159, %vector.body151 ]
  %offset.idx153 = shl i64 %index152, 2
  %105 = or disjoint i64 %offset.idx153, 4
  %106 = or disjoint i64 %offset.idx153, 8
  %107 = or disjoint i64 %offset.idx153, 12
  %108 = getelementptr inbounds float, ptr %9, i64 %offset.idx153
  %109 = getelementptr inbounds float, ptr %9, i64 %105
  %110 = getelementptr inbounds float, ptr %9, i64 %106
  %111 = getelementptr inbounds float, ptr %9, i64 %107
  %112 = load float, ptr %108, align 4, !tbaa !12, !alias.scope !21
  %113 = load float, ptr %109, align 4, !tbaa !12, !alias.scope !21
  %114 = load float, ptr %110, align 4, !tbaa !12, !alias.scope !21
  %115 = load float, ptr %111, align 4, !tbaa !12, !alias.scope !21
  %116 = insertelement <4 x float> poison, float %112, i64 0
  %117 = insertelement <4 x float> %116, float %113, i64 1
  %118 = insertelement <4 x float> %117, float %114, i64 2
  %119 = insertelement <4 x float> %118, float %115, i64 3
  %120 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %119, <4 x float> %broadcast.splat155, <4 x float> %broadcast.splat157)
  %121 = or disjoint i64 %offset.idx153, 1
  %122 = or disjoint i64 %offset.idx153, 5
  %123 = or disjoint i64 %offset.idx153, 9
  %124 = or disjoint i64 %offset.idx153, 13
  %125 = getelementptr inbounds float, ptr %9, i64 %121
  %126 = getelementptr inbounds float, ptr %9, i64 %122
  %127 = getelementptr inbounds float, ptr %9, i64 %123
  %128 = getelementptr inbounds float, ptr %9, i64 %124
  %129 = load float, ptr %125, align 4, !tbaa !12, !alias.scope !21
  %130 = load float, ptr %126, align 4, !tbaa !12, !alias.scope !21
  %131 = load float, ptr %127, align 4, !tbaa !12, !alias.scope !21
  %132 = load float, ptr %128, align 4, !tbaa !12, !alias.scope !21
  %133 = insertelement <4 x float> poison, float %129, i64 0
  %134 = insertelement <4 x float> %133, float %130, i64 1
  %135 = insertelement <4 x float> %134, float %131, i64 2
  %136 = insertelement <4 x float> %135, float %132, i64 3
  %137 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %136, <4 x float> %broadcast.splat155, <4 x float> %broadcast.splat157)
  %138 = or disjoint i64 %offset.idx153, 2
  %139 = or disjoint i64 %offset.idx153, 6
  %140 = or disjoint i64 %offset.idx153, 10
  %141 = or disjoint i64 %offset.idx153, 14
  %142 = getelementptr inbounds float, ptr %9, i64 %138
  %143 = getelementptr inbounds float, ptr %9, i64 %139
  %144 = getelementptr inbounds float, ptr %9, i64 %140
  %145 = getelementptr inbounds float, ptr %9, i64 %141
  %146 = load float, ptr %142, align 4, !tbaa !12, !alias.scope !21
  %147 = load float, ptr %143, align 4, !tbaa !12, !alias.scope !21
  %148 = load float, ptr %144, align 4, !tbaa !12, !alias.scope !21
  %149 = load float, ptr %145, align 4, !tbaa !12, !alias.scope !21
  %150 = insertelement <4 x float> poison, float %146, i64 0
  %151 = insertelement <4 x float> %150, float %147, i64 1
  %152 = insertelement <4 x float> %151, float %148, i64 2
  %153 = insertelement <4 x float> %152, float %149, i64 3
  %154 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %153, <4 x float> %broadcast.splat155, <4 x float> %broadcast.splat157)
  %155 = or disjoint i64 %offset.idx153, 3
  %156 = or disjoint i64 %offset.idx153, 7
  %157 = or disjoint i64 %offset.idx153, 11
  %158 = or disjoint i64 %offset.idx153, 15
  %159 = getelementptr inbounds float, ptr %9, i64 %155
  %160 = getelementptr inbounds float, ptr %9, i64 %156
  %161 = getelementptr inbounds float, ptr %9, i64 %157
  %162 = getelementptr inbounds float, ptr %9, i64 %158
  %163 = load float, ptr %159, align 4, !tbaa !12, !alias.scope !21
  %164 = load float, ptr %160, align 4, !tbaa !12, !alias.scope !21
  %165 = load float, ptr %161, align 4, !tbaa !12, !alias.scope !21
  %166 = load float, ptr %162, align 4, !tbaa !12, !alias.scope !21
  %167 = insertelement <4 x float> poison, float %163, i64 0
  %168 = insertelement <4 x float> %167, float %164, i64 1
  %169 = insertelement <4 x float> %168, float %165, i64 2
  %170 = insertelement <4 x float> %169, float %166, i64 3
  %171 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %170, <4 x float> %broadcast.splat155, <4 x float> %broadcast.splat157)
  %gep196 = getelementptr float, ptr %invariant.gep195, i64 %155
  %172 = shufflevector <4 x float> %120, <4 x float> %137, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
  %173 = shufflevector <4 x float> %154, <4 x float> %171, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
  %interleaved.vec158 = shufflevector <8 x float> %172, <8 x float> %173, <16 x i32> <i32 0, i32 4, i32 8, i32 12, i32 1, i32 5, i32 9, i32 13, i32 2, i32 6, i32 10, i32 14, i32 3, i32 7, i32 11, i32 15>
  store <16 x float> %interleaved.vec158, ptr %gep196, align 4, !tbaa !12
  %index.next159 = add nuw i64 %index152, 4
  %174 = icmp eq i64 %index.next159, %n.vec148
  br i1 %174, label %middle.block143, label %vector.body151, !llvm.loop !24

middle.block143:                                  ; preds = %vector.body151
  %cmp.n160 = icmp eq i64 %100, %n.vec148
  br i1 %cmp.n160, label %.preheader.loopexit, label %.lr.ph95.preheader184

.preheader.loopexit:                              ; preds = %.lr.ph95, %middle.block143
  %indvars.iv.next107.lcssa = phi i64 [ %ind.end149, %middle.block143 ], [ %indvars.iv.next107, %.lr.ph95 ]
  %175 = trunc nuw nsw i64 %indvars.iv.next107.lcssa to i32
  br label %.preheader

.preheader:                                       ; preds = %.preheader.loopexit, %.preheader85
  %.080.lcssa = phi i32 [ 0, %.preheader85 ], [ %175, %.preheader.loopexit ]
  %176 = icmp slt i32 %.080.lcssa, %15
  br i1 %176, label %.lr.ph99.preheader, label %.loopexit

.lr.ph99.preheader:                               ; preds = %.preheader
  %177 = zext i32 %.080.lcssa to i64
  %wide.trip.count112 = zext i32 %15 to i64
  %178 = sub nsw i64 %wide.trip.count112, %177
  %min.iters.check165 = icmp ult i64 %178, 8
  %179 = sub i64 %13, %10
  %diff.check162 = icmp ult i64 %179, 32
  %or.cond = select i1 %min.iters.check165, i1 true, i1 %diff.check162
  br i1 %or.cond, label %.lr.ph99.preheader183, label %vector.ph166

.lr.ph99.preheader183:                            ; preds = %middle.block163, %.lr.ph99.preheader
  %indvars.iv109.ph = phi i64 [ %177, %.lr.ph99.preheader ], [ %ind.end169, %middle.block163 ]
  %180 = sub nsw i64 %wide.trip.count112, %indvars.iv109.ph
  %xtraiter190 = and i64 %180, 3
  %lcmp.mod191.not = icmp eq i64 %xtraiter190, 0
  br i1 %lcmp.mod191.not, label %.lr.ph99.prol.loopexit, label %.lr.ph99.prol

.lr.ph99.prol:                                    ; preds = %.lr.ph99.preheader183, %.lr.ph99.prol
  %indvars.iv109.prol = phi i64 [ %indvars.iv.next110.prol, %.lr.ph99.prol ], [ %indvars.iv109.ph, %.lr.ph99.preheader183 ]
  %prol.iter192 = phi i64 [ %prol.iter192.next, %.lr.ph99.prol ], [ 0, %.lr.ph99.preheader183 ]
  %181 = getelementptr inbounds float, ptr %9, i64 %indvars.iv109.prol
  %182 = load float, ptr %181, align 4, !tbaa !12
  %183 = tail call float @llvm.fmuladd.f32(float %182, float %2, float %3)
  %184 = getelementptr inbounds float, ptr %12, i64 %indvars.iv109.prol
  store float %183, ptr %184, align 4, !tbaa !12
  %indvars.iv.next110.prol = add nuw nsw i64 %indvars.iv109.prol, 1
  %prol.iter192.next = add i64 %prol.iter192, 1
  %prol.iter192.cmp.not = icmp eq i64 %prol.iter192.next, %xtraiter190
  br i1 %prol.iter192.cmp.not, label %.lr.ph99.prol.loopexit, label %.lr.ph99.prol, !llvm.loop !25

.lr.ph99.prol.loopexit:                           ; preds = %.lr.ph99.prol, %.lr.ph99.preheader183
  %indvars.iv109.unr = phi i64 [ %indvars.iv109.ph, %.lr.ph99.preheader183 ], [ %indvars.iv.next110.prol, %.lr.ph99.prol ]
  %185 = sub nsw i64 %indvars.iv109.ph, %wide.trip.count112
  %186 = icmp ugt i64 %185, -4
  br i1 %186, label %.loopexit, label %.lr.ph99

vector.ph166:                                     ; preds = %.lr.ph99.preheader
  %n.vec168 = and i64 %178, -8
  %ind.end169 = add nsw i64 %n.vec168, %177
  %broadcast.splatinsert176 = insertelement <4 x float> poison, float %2, i64 0
  %broadcast.splat177 = shufflevector <4 x float> %broadcast.splatinsert176, <4 x float> poison, <4 x i32> zeroinitializer
  %broadcast.splatinsert178 = insertelement <4 x float> poison, float %3, i64 0
  %broadcast.splat179 = shufflevector <4 x float> %broadcast.splatinsert178, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body171

vector.body171:                                   ; preds = %vector.body171, %vector.ph166
  %index172 = phi i64 [ 0, %vector.ph166 ], [ %index.next180, %vector.body171 ]
  %offset.idx173 = add i64 %index172, %177
  %187 = getelementptr inbounds float, ptr %9, i64 %offset.idx173
  %188 = getelementptr inbounds i8, ptr %187, i64 16
  %wide.load174 = load <4 x float>, ptr %187, align 4, !tbaa !12
  %wide.load175 = load <4 x float>, ptr %188, align 4, !tbaa !12
  %189 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %wide.load174, <4 x float> %broadcast.splat177, <4 x float> %broadcast.splat179)
  %190 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %wide.load175, <4 x float> %broadcast.splat177, <4 x float> %broadcast.splat179)
  %191 = getelementptr inbounds float, ptr %12, i64 %offset.idx173
  %192 = getelementptr inbounds i8, ptr %191, i64 16
  store <4 x float> %189, ptr %191, align 4, !tbaa !12
  store <4 x float> %190, ptr %192, align 4, !tbaa !12
  %index.next180 = add nuw i64 %index172, 8
  %193 = icmp eq i64 %index.next180, %n.vec168
  br i1 %193, label %middle.block163, label %vector.body171, !llvm.loop !27

middle.block163:                                  ; preds = %vector.body171
  %cmp.n181 = icmp eq i64 %178, %n.vec168
  br i1 %cmp.n181, label %.loopexit, label %.lr.ph99.preheader183

.lr.ph95:                                         ; preds = %.lr.ph95.preheader184, %.lr.ph95
  %indvars.iv106 = phi i64 [ %indvars.iv.next107, %.lr.ph95 ], [ %indvars.iv106.ph, %.lr.ph95.preheader184 ]
  %194 = getelementptr inbounds float, ptr %9, i64 %indvars.iv106
  %195 = load float, ptr %194, align 4, !tbaa !12
  %196 = tail call float @llvm.fmuladd.f32(float %195, float %2, float %3)
  %197 = getelementptr inbounds float, ptr %12, i64 %indvars.iv106
  store float %196, ptr %197, align 4, !tbaa !12
  %198 = or disjoint i64 %indvars.iv106, 1
  %199 = getelementptr inbounds float, ptr %9, i64 %198
  %200 = load float, ptr %199, align 4, !tbaa !12
  %201 = tail call float @llvm.fmuladd.f32(float %200, float %2, float %3)
  %202 = getelementptr inbounds float, ptr %12, i64 %198
  store float %201, ptr %202, align 4, !tbaa !12
  %203 = or disjoint i64 %indvars.iv106, 2
  %204 = getelementptr inbounds float, ptr %9, i64 %203
  %205 = load float, ptr %204, align 4, !tbaa !12
  %206 = tail call float @llvm.fmuladd.f32(float %205, float %2, float %3)
  %207 = getelementptr inbounds float, ptr %12, i64 %203
  store float %206, ptr %207, align 4, !tbaa !12
  %208 = or disjoint i64 %indvars.iv106, 3
  %209 = getelementptr inbounds float, ptr %9, i64 %208
  %210 = load float, ptr %209, align 4, !tbaa !12
  %211 = tail call float @llvm.fmuladd.f32(float %210, float %2, float %3)
  %212 = getelementptr inbounds float, ptr %12, i64 %208
  store float %211, ptr %212, align 4, !tbaa !12
  %indvars.iv.next107 = add nuw nsw i64 %indvars.iv106, 4
  %213 = icmp ult i64 %indvars.iv.next107, %97
  br i1 %213, label %.lr.ph95, label %.preheader.loopexit, !llvm.loop !28

.lr.ph99:                                         ; preds = %.lr.ph99.prol.loopexit, %.lr.ph99
  %indvars.iv109 = phi i64 [ %indvars.iv.next110.3, %.lr.ph99 ], [ %indvars.iv109.unr, %.lr.ph99.prol.loopexit ]
  %214 = getelementptr inbounds float, ptr %9, i64 %indvars.iv109
  %215 = load float, ptr %214, align 4, !tbaa !12
  %216 = tail call float @llvm.fmuladd.f32(float %215, float %2, float %3)
  %217 = getelementptr inbounds float, ptr %12, i64 %indvars.iv109
  store float %216, ptr %217, align 4, !tbaa !12
  %indvars.iv.next110 = add nuw nsw i64 %indvars.iv109, 1
  %218 = getelementptr inbounds float, ptr %9, i64 %indvars.iv.next110
  %219 = load float, ptr %218, align 4, !tbaa !12
  %220 = tail call float @llvm.fmuladd.f32(float %219, float %2, float %3)
  %221 = getelementptr inbounds float, ptr %12, i64 %indvars.iv.next110
  store float %220, ptr %221, align 4, !tbaa !12
  %indvars.iv.next110.1 = add nuw nsw i64 %indvars.iv109, 2
  %222 = getelementptr inbounds float, ptr %9, i64 %indvars.iv.next110.1
  %223 = load float, ptr %222, align 4, !tbaa !12
  %224 = tail call float @llvm.fmuladd.f32(float %223, float %2, float %3)
  %225 = getelementptr inbounds float, ptr %12, i64 %indvars.iv.next110.1
  store float %224, ptr %225, align 4, !tbaa !12
  %indvars.iv.next110.2 = add nuw nsw i64 %indvars.iv109, 3
  %226 = getelementptr inbounds float, ptr %9, i64 %indvars.iv.next110.2
  %227 = load float, ptr %226, align 4, !tbaa !12
  %228 = tail call float @llvm.fmuladd.f32(float %227, float %2, float %3)
  %229 = getelementptr inbounds float, ptr %12, i64 %indvars.iv.next110.2
  store float %228, ptr %229, align 4, !tbaa !12
  %indvars.iv.next110.3 = add nuw nsw i64 %indvars.iv109, 4
  %exitcond113.not.3 = icmp eq i64 %indvars.iv.next110.3, %wide.trip.count112
  br i1 %exitcond113.not.3, label %.loopexit, label %.lr.ph99, !llvm.loop !29

.preheader86.loopexit:                            ; preds = %.lr.ph, %middle.block
  %indvars.iv.next.lcssa = phi i64 [ %ind.end, %middle.block ], [ %indvars.iv.next, %.lr.ph ]
  %230 = trunc nuw nsw i64 %indvars.iv.next.lcssa to i32
  br label %.preheader86

.preheader86:                                     ; preds = %.preheader86.loopexit, %.preheader88
  %.0.lcssa = phi i32 [ 0, %.preheader88 ], [ %230, %.preheader86.loopexit ]
  %231 = icmp slt i32 %.0.lcssa, %15
  br i1 %231, label %.lr.ph93.preheader, label %.loopexit

.lr.ph93.preheader:                               ; preds = %.preheader86
  %232 = zext i32 %.0.lcssa to i64
  %wide.trip.count = zext i32 %15 to i64
  %233 = sub nsw i64 %wide.trip.count, %232
  %min.iters.check121 = icmp ult i64 %233, 8
  %234 = sub i64 %13, %10
  %diff.check = icmp ult i64 %234, 32
  %or.cond182 = select i1 %min.iters.check121, i1 true, i1 %diff.check
  br i1 %or.cond182, label %.lr.ph93.preheader186, label %vector.ph122

.lr.ph93.preheader186:                            ; preds = %middle.block119, %.lr.ph93.preheader
  %indvars.iv103.ph = phi i64 [ %232, %.lr.ph93.preheader ], [ %ind.end125, %middle.block119 ]
  %235 = sub nsw i64 %wide.trip.count, %indvars.iv103.ph
  %xtraiter = and i64 %235, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph93.prol.loopexit, label %.lr.ph93.prol

.lr.ph93.prol:                                    ; preds = %.lr.ph93.preheader186, %.lr.ph93.prol
  %indvars.iv103.prol = phi i64 [ %indvars.iv.next104.prol, %.lr.ph93.prol ], [ %indvars.iv103.ph, %.lr.ph93.preheader186 ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph93.prol ], [ 0, %.lr.ph93.preheader186 ]
  %236 = getelementptr inbounds float, ptr %9, i64 %indvars.iv103.prol
  %237 = load float, ptr %236, align 4, !tbaa !12
  %238 = fmul float %237, %2
  %239 = getelementptr inbounds float, ptr %12, i64 %indvars.iv103.prol
  store float %238, ptr %239, align 4, !tbaa !12
  %indvars.iv.next104.prol = add nuw nsw i64 %indvars.iv103.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph93.prol.loopexit, label %.lr.ph93.prol, !llvm.loop !30

.lr.ph93.prol.loopexit:                           ; preds = %.lr.ph93.prol, %.lr.ph93.preheader186
  %indvars.iv103.unr = phi i64 [ %indvars.iv103.ph, %.lr.ph93.preheader186 ], [ %indvars.iv.next104.prol, %.lr.ph93.prol ]
  %240 = sub nsw i64 %indvars.iv103.ph, %wide.trip.count
  %241 = icmp ugt i64 %240, -4
  br i1 %241, label %.loopexit, label %.lr.ph93

vector.ph122:                                     ; preds = %.lr.ph93.preheader
  %n.vec124 = and i64 %233, -8
  %ind.end125 = add nsw i64 %n.vec124, %232
  %broadcast.splatinsert131 = insertelement <4 x float> poison, float %2, i64 0
  %broadcast.splat132 = shufflevector <4 x float> %broadcast.splatinsert131, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body127

vector.body127:                                   ; preds = %vector.body127, %vector.ph122
  %index128 = phi i64 [ 0, %vector.ph122 ], [ %index.next133, %vector.body127 ]
  %offset.idx129 = add i64 %index128, %232
  %242 = getelementptr inbounds float, ptr %9, i64 %offset.idx129
  %243 = getelementptr inbounds i8, ptr %242, i64 16
  %wide.load = load <4 x float>, ptr %242, align 4, !tbaa !12
  %wide.load130 = load <4 x float>, ptr %243, align 4, !tbaa !12
  %244 = fmul <4 x float> %wide.load, %broadcast.splat132
  %245 = fmul <4 x float> %wide.load130, %broadcast.splat132
  %246 = getelementptr inbounds float, ptr %12, i64 %offset.idx129
  %247 = getelementptr inbounds i8, ptr %246, i64 16
  store <4 x float> %244, ptr %246, align 4, !tbaa !12
  store <4 x float> %245, ptr %247, align 4, !tbaa !12
  %index.next133 = add nuw i64 %index128, 8
  %248 = icmp eq i64 %index.next133, %n.vec124
  br i1 %248, label %middle.block119, label %vector.body127, !llvm.loop !31

middle.block119:                                  ; preds = %vector.body127
  %cmp.n134 = icmp eq i64 %233, %n.vec124
  br i1 %cmp.n134, label %.loopexit, label %.lr.ph93.preheader186

.lr.ph:                                           ; preds = %.lr.ph.preheader188, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %indvars.iv.ph, %.lr.ph.preheader188 ]
  %249 = getelementptr inbounds float, ptr %9, i64 %indvars.iv
  %250 = load float, ptr %249, align 4, !tbaa !12
  %251 = fmul float %250, %2
  %252 = getelementptr inbounds float, ptr %12, i64 %indvars.iv
  store float %251, ptr %252, align 4, !tbaa !12
  %253 = or disjoint i64 %indvars.iv, 1
  %254 = getelementptr inbounds float, ptr %9, i64 %253
  %255 = load float, ptr %254, align 4, !tbaa !12
  %256 = fmul float %255, %2
  %257 = getelementptr inbounds float, ptr %12, i64 %253
  store float %256, ptr %257, align 4, !tbaa !12
  %258 = or disjoint i64 %indvars.iv, 2
  %259 = getelementptr inbounds float, ptr %9, i64 %258
  %260 = load float, ptr %259, align 4, !tbaa !12
  %261 = fmul float %260, %2
  %262 = getelementptr inbounds float, ptr %12, i64 %258
  store float %261, ptr %262, align 4, !tbaa !12
  %263 = or disjoint i64 %indvars.iv, 3
  %264 = getelementptr inbounds float, ptr %9, i64 %263
  %265 = load float, ptr %264, align 4, !tbaa !12
  %266 = fmul float %265, %2
  %267 = getelementptr inbounds float, ptr %12, i64 %263
  store float %266, ptr %267, align 4, !tbaa !12
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 4
  %268 = icmp ult i64 %indvars.iv.next, %18
  br i1 %268, label %.lr.ph, label %.preheader86.loopexit, !llvm.loop !32

.lr.ph93:                                         ; preds = %.lr.ph93.prol.loopexit, %.lr.ph93
  %indvars.iv103 = phi i64 [ %indvars.iv.next104.3, %.lr.ph93 ], [ %indvars.iv103.unr, %.lr.ph93.prol.loopexit ]
  %269 = getelementptr inbounds float, ptr %9, i64 %indvars.iv103
  %270 = load float, ptr %269, align 4, !tbaa !12
  %271 = fmul float %270, %2
  %272 = getelementptr inbounds float, ptr %12, i64 %indvars.iv103
  store float %271, ptr %272, align 4, !tbaa !12
  %indvars.iv.next104 = add nuw nsw i64 %indvars.iv103, 1
  %273 = getelementptr inbounds float, ptr %9, i64 %indvars.iv.next104
  %274 = load float, ptr %273, align 4, !tbaa !12
  %275 = fmul float %274, %2
  %276 = getelementptr inbounds float, ptr %12, i64 %indvars.iv.next104
  store float %275, ptr %276, align 4, !tbaa !12
  %indvars.iv.next104.1 = add nuw nsw i64 %indvars.iv103, 2
  %277 = getelementptr inbounds float, ptr %9, i64 %indvars.iv.next104.1
  %278 = load float, ptr %277, align 4, !tbaa !12
  %279 = fmul float %278, %2
  %280 = getelementptr inbounds float, ptr %12, i64 %indvars.iv.next104.1
  store float %279, ptr %280, align 4, !tbaa !12
  %indvars.iv.next104.2 = add nuw nsw i64 %indvars.iv103, 3
  %281 = getelementptr inbounds float, ptr %9, i64 %indvars.iv.next104.2
  %282 = load float, ptr %281, align 4, !tbaa !12
  %283 = fmul float %282, %2
  %284 = getelementptr inbounds float, ptr %12, i64 %indvars.iv.next104.2
  store float %283, ptr %284, align 4, !tbaa !12
  %indvars.iv.next104.3 = add nuw nsw i64 %indvars.iv103, 4
  %exitcond.not.3 = icmp eq i64 %indvars.iv.next104.3, %wide.trip.count
  br i1 %exitcond.not.3, label %.loopexit, label %.lr.ph93, !llvm.loop !33

.loopexit:                                        ; preds = %.lr.ph93.prol.loopexit, %.lr.ph93, %.lr.ph99.prol.loopexit, %.lr.ph99, %middle.block119, %middle.block163, %.preheader86, %.preheader
  ret void
}

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

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

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 speculatable willreturn memory(none) }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }

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

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


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