; LLVM IR from Aakriti05/DSP-implementation_LMS_RNN :: rnn (recurrent_dot)

; 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: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

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

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

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

; Function Attrs: nounwind uwtable
define dso_local ptr @recurrent_dot(ptr noundef %0, ptr noundef %1) #3 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  store ptr %1, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #4
  %11 = call noalias ptr @malloc(i64 noundef 256) #5
  store ptr %11, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #4
  store i32 0, ptr %6, align 4, !tbaa !9
  br label %12

12:                                               ; preds = %22, %2
  %13 = load i32, ptr %6, align 4, !tbaa !9
  %14 = icmp slt i32 %13, 32
  br i1 %14, label %16, label %15

15:                                               ; preds = %12
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #4
  br label %25

16:                                               ; preds = %12
  %17 = call noalias ptr @malloc(i64 noundef 128) #5
  %18 = load ptr, ptr %5, align 8, !tbaa !5
  %19 = load i32, ptr %6, align 4, !tbaa !9
  %20 = sext i32 %19 to i64
  %21 = getelementptr inbounds ptr, ptr %18, i64 %20
  store ptr %17, ptr %21, align 8, !tbaa !5
  br label %22

22:                                               ; preds = %16
  %23 = load i32, ptr %6, align 4, !tbaa !9
  %24 = add nsw i32 %23, 1
  store i32 %24, ptr %6, align 4, !tbaa !9
  br label %12, !llvm.loop !11

25:                                               ; preds = %15
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #4
  store i32 0, ptr %7, align 4, !tbaa !9
  br label %26

26:                                               ; preds = %85, %25
  %27 = load i32, ptr %7, align 4, !tbaa !9
  %28 = icmp slt i32 %27, 32
  br i1 %28, label %30, label %29

29:                                               ; preds = %26
  store i32 5, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #4
  br label %88

30:                                               ; preds = %26
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  store i32 0, ptr %9, align 4, !tbaa !9
  br label %31

31:                                               ; preds = %81, %30
  %32 = load i32, ptr %9, align 4, !tbaa !9
  %33 = icmp slt i32 %32, 16
  br i1 %33, label %35, label %34

34:                                               ; preds = %31
  store i32 8, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  br label %84

35:                                               ; preds = %31
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #4
  store i32 0, ptr %10, align 4, !tbaa !9
  br label %36

36:                                               ; preds = %77, %35
  %37 = load i32, ptr %10, align 4, !tbaa !9
  %38 = icmp slt i32 %37, 16
  br i1 %38, label %40, label %39

39:                                               ; preds = %36
  store i32 11, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #4
  br label %80

40:                                               ; preds = %36
  %41 = load ptr, ptr %5, align 8, !tbaa !5
  %42 = load i32, ptr %7, align 4, !tbaa !9
  %43 = sext i32 %42 to i64
  %44 = getelementptr inbounds ptr, ptr %41, i64 %43
  %45 = load ptr, ptr %44, align 8, !tbaa !5
  %46 = load i32, ptr %9, align 4, !tbaa !9
  %47 = sext i32 %46 to i64
  %48 = getelementptr inbounds double, ptr %45, i64 %47
  %49 = load double, ptr %48, align 8, !tbaa !13
  %50 = load ptr, ptr %3, align 8, !tbaa !5
  %51 = load i32, ptr %7, align 4, !tbaa !9
  %52 = sext i32 %51 to i64
  %53 = getelementptr inbounds ptr, ptr %50, i64 %52
  %54 = load ptr, ptr %53, align 8, !tbaa !5
  %55 = load i32, ptr %10, align 4, !tbaa !9
  %56 = sext i32 %55 to i64
  %57 = getelementptr inbounds double, ptr %54, i64 %56
  %58 = load double, ptr %57, align 8, !tbaa !13
  %59 = load ptr, ptr %4, align 8, !tbaa !5
  %60 = load i32, ptr %10, align 4, !tbaa !9
  %61 = sext i32 %60 to i64
  %62 = getelementptr inbounds ptr, ptr %59, i64 %61
  %63 = load ptr, ptr %62, align 8, !tbaa !5
  %64 = load i32, ptr %9, align 4, !tbaa !9
  %65 = sext i32 %64 to i64
  %66 = getelementptr inbounds double, ptr %63, i64 %65
  %67 = load double, ptr %66, align 8, !tbaa !13
  %68 = call double @llvm.fmuladd.f64(double %58, double %67, double %49)
  %69 = load ptr, ptr %5, align 8, !tbaa !5
  %70 = load i32, ptr %7, align 4, !tbaa !9
  %71 = sext i32 %70 to i64
  %72 = getelementptr inbounds ptr, ptr %69, i64 %71
  %73 = load ptr, ptr %72, align 8, !tbaa !5
  %74 = load i32, ptr %9, align 4, !tbaa !9
  %75 = sext i32 %74 to i64
  %76 = getelementptr inbounds double, ptr %73, i64 %75
  store double %68, ptr %76, align 8, !tbaa !13
  br label %77

77:                                               ; preds = %40
  %78 = load i32, ptr %10, align 4, !tbaa !9
  %79 = add nsw i32 %78, 1
  store i32 %79, ptr %10, align 4, !tbaa !9
  br label %36, !llvm.loop !15

80:                                               ; preds = %39
  br label %81

81:                                               ; preds = %80
  %82 = load i32, ptr %9, align 4, !tbaa !9
  %83 = add nsw i32 %82, 1
  store i32 %83, ptr %9, align 4, !tbaa !9
  br label %31, !llvm.loop !16

84:                                               ; preds = %34
  br label %85

85:                                               ; preds = %84
  %86 = load i32, ptr %7, align 4, !tbaa !9
  %87 = add nsw i32 %86, 1
  store i32 %87, ptr %7, align 4, !tbaa !9
  br label %26, !llvm.loop !17

88:                                               ; preds = %29
  %89 = load ptr, ptr %5, align 8, !tbaa !5
  store i32 1, ptr %8, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %5) #4
  ret ptr %89
}

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

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

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


; 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: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #0

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

; Function Attrs: nofree nounwind uwtable
define dso_local noalias noundef ptr @recurrent_dot(ptr nocapture noundef readonly %0, ptr nocapture noundef readonly %1) local_unnamed_addr #2 {
.preheader25.preheader:
  %2 = tail call noalias dereferenceable_or_null(256) ptr @malloc(i64 noundef 256) #4
  %3 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  store ptr %3, ptr %2, align 8, !tbaa !5
  %4 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %5 = getelementptr inbounds i8, ptr %2, i64 8
  store ptr %4, ptr %5, align 8, !tbaa !5
  %6 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %7 = getelementptr inbounds i8, ptr %2, i64 16
  store ptr %6, ptr %7, align 8, !tbaa !5
  %8 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %9 = getelementptr inbounds i8, ptr %2, i64 24
  store ptr %8, ptr %9, align 8, !tbaa !5
  %10 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %11 = getelementptr inbounds i8, ptr %2, i64 32
  store ptr %10, ptr %11, align 8, !tbaa !5
  %12 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %13 = getelementptr inbounds i8, ptr %2, i64 40
  store ptr %12, ptr %13, align 8, !tbaa !5
  %14 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %15 = getelementptr inbounds i8, ptr %2, i64 48
  store ptr %14, ptr %15, align 8, !tbaa !5
  %16 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %17 = getelementptr inbounds i8, ptr %2, i64 56
  store ptr %16, ptr %17, align 8, !tbaa !5
  %18 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %19 = getelementptr inbounds i8, ptr %2, i64 64
  store ptr %18, ptr %19, align 8, !tbaa !5
  %20 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %21 = getelementptr inbounds i8, ptr %2, i64 72
  store ptr %20, ptr %21, align 8, !tbaa !5
  %22 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %23 = getelementptr inbounds i8, ptr %2, i64 80
  store ptr %22, ptr %23, align 8, !tbaa !5
  %24 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %25 = getelementptr inbounds i8, ptr %2, i64 88
  store ptr %24, ptr %25, align 8, !tbaa !5
  %26 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %27 = getelementptr inbounds i8, ptr %2, i64 96
  store ptr %26, ptr %27, align 8, !tbaa !5
  %28 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %29 = getelementptr inbounds i8, ptr %2, i64 104
  store ptr %28, ptr %29, align 8, !tbaa !5
  %30 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %31 = getelementptr inbounds i8, ptr %2, i64 112
  store ptr %30, ptr %31, align 8, !tbaa !5
  %32 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %33 = getelementptr inbounds i8, ptr %2, i64 120
  store ptr %32, ptr %33, align 8, !tbaa !5
  %34 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %35 = getelementptr inbounds i8, ptr %2, i64 128
  store ptr %34, ptr %35, align 8, !tbaa !5
  %36 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %37 = getelementptr inbounds i8, ptr %2, i64 136
  store ptr %36, ptr %37, align 8, !tbaa !5
  %38 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %39 = getelementptr inbounds i8, ptr %2, i64 144
  store ptr %38, ptr %39, align 8, !tbaa !5
  %40 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %41 = getelementptr inbounds i8, ptr %2, i64 152
  store ptr %40, ptr %41, align 8, !tbaa !5
  %42 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %43 = getelementptr inbounds i8, ptr %2, i64 160
  store ptr %42, ptr %43, align 8, !tbaa !5
  %44 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %45 = getelementptr inbounds i8, ptr %2, i64 168
  store ptr %44, ptr %45, align 8, !tbaa !5
  %46 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %47 = getelementptr inbounds i8, ptr %2, i64 176
  store ptr %46, ptr %47, align 8, !tbaa !5
  %48 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %49 = getelementptr inbounds i8, ptr %2, i64 184
  store ptr %48, ptr %49, align 8, !tbaa !5
  %50 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %51 = getelementptr inbounds i8, ptr %2, i64 192
  store ptr %50, ptr %51, align 8, !tbaa !5
  %52 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %53 = getelementptr inbounds i8, ptr %2, i64 200
  store ptr %52, ptr %53, align 8, !tbaa !5
  %54 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %55 = getelementptr inbounds i8, ptr %2, i64 208
  store ptr %54, ptr %55, align 8, !tbaa !5
  %56 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %57 = getelementptr inbounds i8, ptr %2, i64 216
  store ptr %56, ptr %57, align 8, !tbaa !5
  %58 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %59 = getelementptr inbounds i8, ptr %2, i64 224
  store ptr %58, ptr %59, align 8, !tbaa !5
  %60 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %61 = getelementptr inbounds i8, ptr %2, i64 232
  store ptr %60, ptr %61, align 8, !tbaa !5
  %62 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %63 = getelementptr inbounds i8, ptr %2, i64 240
  store ptr %62, ptr %63, align 8, !tbaa !5
  %64 = tail call noalias dereferenceable_or_null(128) ptr @malloc(i64 noundef 128) #4
  %65 = getelementptr inbounds i8, ptr %2, i64 248
  store ptr %64, ptr %65, align 8, !tbaa !5
  %.phi.trans.insert = getelementptr inbounds i8, ptr %1, i64 32
  %.pre = load ptr, ptr %.phi.trans.insert, align 8, !tbaa !5
  %.phi.trans.insert38 = getelementptr inbounds i8, ptr %1, i64 40
  %66 = load <4 x ptr>, ptr %.phi.trans.insert38, align 8, !tbaa !5
  %.phi.trans.insert46 = getelementptr inbounds i8, ptr %1, i64 72
  %67 = load <4 x ptr>, ptr %.phi.trans.insert46, align 8, !tbaa !5
  %.phi.trans.insert54 = getelementptr inbounds i8, ptr %1, i64 104
  %68 = load <4 x ptr>, ptr %1, align 8, !tbaa !5
  %69 = load <2 x ptr>, ptr %.phi.trans.insert54, align 8, !tbaa !5
  %70 = getelementptr inbounds i8, ptr %1, i64 120
  %71 = load ptr, ptr %70, align 8, !tbaa !5
  %72 = getelementptr i8, <4 x ptr> %68, <4 x i64> <i64 128, i64 128, i64 128, i64 128>
  %scevgep61 = getelementptr i8, ptr %.pre, i64 128
  %73 = shufflevector <4 x ptr> %67, <4 x ptr> poison, <8 x i32> <i32 poison, i32 poison, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>
  %74 = shufflevector <4 x ptr> %66, <4 x ptr> %67, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 poison, i32 poison>
  %75 = shufflevector <8 x ptr> %74, <8 x ptr> %73, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 10, i32 11>
  %76 = getelementptr i8, <8 x ptr> %75, <8 x i64> <i64 128, i64 128, i64 128, i64 128, i64 128, i64 128, i64 128, i64 128>
  %77 = getelementptr i8, <2 x ptr> %69, <2 x i64> <i64 128, i64 128>
  %scevgep72 = getelementptr i8, ptr %71, i64 128
  %78 = shufflevector <4 x ptr> %68, <4 x ptr> poison, <16 x i32> <i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %79 = shufflevector <4 x ptr> %66, <4 x ptr> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %80 = shufflevector <4 x ptr> %67, <4 x ptr> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %81 = shufflevector <2 x ptr> %69, <2 x ptr> poison, <16 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %82 = shufflevector <8 x ptr> %76, <8 x ptr> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %83 = shufflevector <2 x ptr> %77, <2 x ptr> poison, <16 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %84 = shufflevector <4 x ptr> %72, <4 x ptr> poison, <16 x i32> <i32 poison, i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %85 = insertelement <16 x ptr> %84, ptr %scevgep61, i64 5
  %86 = shufflevector <16 x ptr> %85, <16 x ptr> %82, <16 x i32> <i32 poison, i32 1, i32 2, i32 3, i32 4, i32 5, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 poison, i32 poison>
  %87 = shufflevector <16 x ptr> %86, <16 x ptr> %83, <16 x i32> <i32 poison, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 16, i32 17>
  %88 = insertelement <16 x ptr> %78, ptr %.pre, i64 5
  %89 = shufflevector <16 x ptr> %88, <16 x ptr> %79, <16 x i32> <i32 poison, i32 1, i32 2, i32 3, i32 4, i32 5, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
  %90 = shufflevector <16 x ptr> %89, <16 x ptr> %80, <16 x i32> <i32 poison, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 16, i32 17, i32 18, i32 19, i32 poison, i32 poison>
  %91 = shufflevector <16 x ptr> %90, <16 x ptr> %81, <16 x i32> <i32 poison, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 16, i32 17>
  %92 = extractelement <4 x ptr> %68, i64 0
  %93 = extractelement <4 x ptr> %68, i64 1
  %94 = extractelement <4 x ptr> %68, i64 2
  %95 = extractelement <4 x ptr> %68, i64 3
  %96 = extractelement <4 x ptr> %66, i64 0
  %97 = extractelement <4 x ptr> %66, i64 1
  %98 = extractelement <4 x ptr> %66, i64 2
  %99 = extractelement <4 x ptr> %66, i64 3
  %100 = extractelement <4 x ptr> %67, i64 0
  %101 = extractelement <4 x ptr> %67, i64 1
  %102 = extractelement <4 x ptr> %67, i64 2
  %103 = extractelement <4 x ptr> %67, i64 3
  %104 = extractelement <2 x ptr> %69, i64 0
  %105 = extractelement <2 x ptr> %69, i64 1
  %106 = extractelement <4 x ptr> %68, i64 0
  %107 = extractelement <4 x ptr> %68, i64 1
  %108 = extractelement <4 x ptr> %68, i64 2
  %109 = extractelement <4 x ptr> %68, i64 3
  %110 = extractelement <4 x ptr> %66, i64 0
  %111 = extractelement <4 x ptr> %66, i64 1
  %112 = extractelement <4 x ptr> %66, i64 2
  %113 = extractelement <4 x ptr> %66, i64 3
  %114 = extractelement <4 x ptr> %67, i64 0
  %115 = extractelement <4 x ptr> %67, i64 1
  %116 = extractelement <4 x ptr> %67, i64 2
  %117 = extractelement <4 x ptr> %67, i64 3
  %118 = extractelement <2 x ptr> %69, i64 0
  %119 = extractelement <2 x ptr> %69, i64 1
  br label %.preheader25

.preheader25:                                     ; preds = %.preheader25.preheader, %middle.block
  %indvars.iv34 = phi i64 [ 0, %.preheader25.preheader ], [ %indvars.iv.next35, %middle.block ]
  %120 = getelementptr inbounds ptr, ptr %2, i64 %indvars.iv34
  %121 = load ptr, ptr %120, align 8, !tbaa !5
  %122 = getelementptr inbounds ptr, ptr %0, i64 %indvars.iv34
  %123 = load ptr, ptr %122, align 8, !tbaa !5
  %124 = getelementptr inbounds i8, ptr %123, i64 8
  %125 = getelementptr inbounds i8, ptr %123, i64 16
  %126 = getelementptr inbounds i8, ptr %123, i64 24
  %127 = getelementptr inbounds i8, ptr %123, i64 32
  %128 = getelementptr inbounds i8, ptr %123, i64 40
  %129 = getelementptr inbounds i8, ptr %123, i64 48
  %130 = getelementptr inbounds i8, ptr %123, i64 56
  %131 = getelementptr inbounds i8, ptr %123, i64 64
  %132 = getelementptr inbounds i8, ptr %123, i64 72
  %133 = getelementptr inbounds i8, ptr %123, i64 80
  %134 = getelementptr inbounds i8, ptr %123, i64 88
  %135 = getelementptr inbounds i8, ptr %123, i64 96
  %136 = getelementptr inbounds i8, ptr %123, i64 104
  %137 = getelementptr inbounds i8, ptr %123, i64 112
  %138 = getelementptr inbounds i8, ptr %123, i64 120
  %scevgep = getelementptr i8, ptr %121, i64 128
  %scevgep56 = getelementptr i8, ptr %123, i64 128
  %139 = insertelement <16 x ptr> poison, ptr %121, i64 0
  %140 = shufflevector <16 x ptr> %139, <16 x ptr> poison, <16 x i32> zeroinitializer
  %141 = insertelement <16 x ptr> %87, ptr %scevgep56, i64 0
  %142 = icmp ult <16 x ptr> %140, %141
  %143 = insertelement <16 x ptr> %91, ptr %123, i64 0
  %144 = insertelement <16 x ptr> poison, ptr %scevgep, i64 0
  %145 = shufflevector <16 x ptr> %144, <16 x ptr> poison, <16 x i32> zeroinitializer
  %146 = icmp ult <16 x ptr> %143, %145
  %147 = and <16 x i1> %142, %146
  %bound0132 = icmp ult ptr %121, %scevgep72
  %bound1133 = icmp ult ptr %71, %scevgep
  %found.conflict134 = and i1 %bound0132, %bound1133
  %148 = bitcast <16 x i1> %147 to i16
  %149 = icmp ne i16 %148, 0
  %op.rdx = or i1 %149, %found.conflict134
  br i1 %op.rdx, label %.preheader, label %vector.body.preheader

vector.body.preheader:                            ; preds = %.preheader25
  %150 = load double, ptr %123, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert = insertelement <2 x double> poison, double %150, i64 0
  %broadcast.splat = shufflevector <2 x double> %broadcast.splatinsert, <2 x double> poison, <2 x i32> zeroinitializer
  %151 = load double, ptr %124, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert138 = insertelement <2 x double> poison, double %151, i64 0
  %broadcast.splat139 = shufflevector <2 x double> %broadcast.splatinsert138, <2 x double> poison, <2 x i32> zeroinitializer
  %152 = load double, ptr %125, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert141 = insertelement <2 x double> poison, double %152, i64 0
  %broadcast.splat142 = shufflevector <2 x double> %broadcast.splatinsert141, <2 x double> poison, <2 x i32> zeroinitializer
  %153 = load double, ptr %126, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert144 = insertelement <2 x double> poison, double %153, i64 0
  %broadcast.splat145 = shufflevector <2 x double> %broadcast.splatinsert144, <2 x double> poison, <2 x i32> zeroinitializer
  %154 = load double, ptr %127, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert147 = insertelement <2 x double> poison, double %154, i64 0
  %broadcast.splat148 = shufflevector <2 x double> %broadcast.splatinsert147, <2 x double> poison, <2 x i32> zeroinitializer
  %155 = load double, ptr %128, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert150 = insertelement <2 x double> poison, double %155, i64 0
  %broadcast.splat151 = shufflevector <2 x double> %broadcast.splatinsert150, <2 x double> poison, <2 x i32> zeroinitializer
  %156 = load double, ptr %129, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert153 = insertelement <2 x double> poison, double %156, i64 0
  %broadcast.splat154 = shufflevector <2 x double> %broadcast.splatinsert153, <2 x double> poison, <2 x i32> zeroinitializer
  %157 = load double, ptr %130, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert156 = insertelement <2 x double> poison, double %157, i64 0
  %broadcast.splat157 = shufflevector <2 x double> %broadcast.splatinsert156, <2 x double> poison, <2 x i32> zeroinitializer
  %158 = load double, ptr %131, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert159 = insertelement <2 x double> poison, double %158, i64 0
  %broadcast.splat160 = shufflevector <2 x double> %broadcast.splatinsert159, <2 x double> poison, <2 x i32> zeroinitializer
  %159 = load double, ptr %132, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert162 = insertelement <2 x double> poison, double %159, i64 0
  %broadcast.splat163 = shufflevector <2 x double> %broadcast.splatinsert162, <2 x double> poison, <2 x i32> zeroinitializer
  %160 = load double, ptr %133, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert165 = insertelement <2 x double> poison, double %160, i64 0
  %broadcast.splat166 = shufflevector <2 x double> %broadcast.splatinsert165, <2 x double> poison, <2 x i32> zeroinitializer
  %161 = load double, ptr %134, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert168 = insertelement <2 x double> poison, double %161, i64 0
  %broadcast.splat169 = shufflevector <2 x double> %broadcast.splatinsert168, <2 x double> poison, <2 x i32> zeroinitializer
  %162 = load double, ptr %135, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert171 = insertelement <2 x double> poison, double %162, i64 0
  %broadcast.splat172 = shufflevector <2 x double> %broadcast.splatinsert171, <2 x double> poison, <2 x i32> zeroinitializer
  %163 = load double, ptr %136, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert174 = insertelement <2 x double> poison, double %163, i64 0
  %broadcast.splat175 = shufflevector <2 x double> %broadcast.splatinsert174, <2 x double> poison, <2 x i32> zeroinitializer
  %164 = load double, ptr %137, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert177 = insertelement <2 x double> poison, double %164, i64 0
  %broadcast.splat178 = shufflevector <2 x double> %broadcast.splatinsert177, <2 x double> poison, <2 x i32> zeroinitializer
  %165 = load double, ptr %138, align 8, !tbaa !9, !alias.scope !11
  %broadcast.splatinsert180 = insertelement <2 x double> poison, double %165, i64 0
  %broadcast.splat181 = shufflevector <2 x double> %broadcast.splatinsert180, <2 x double> poison, <2 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body.preheader, %vector.body
  %index = phi i64 [ %index.next, %vector.body ], [ 0, %vector.body.preheader ]
  %166 = getelementptr inbounds double, ptr %121, i64 %index
  %wide.load = load <2 x double>, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %167 = getelementptr inbounds double, ptr %92, i64 %index
  %wide.load136 = load <2 x double>, ptr %167, align 8, !tbaa !9, !alias.scope !33
  %168 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat, <2 x double> %wide.load136, <2 x double> %wide.load)
  store <2 x double> %168, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %169 = getelementptr inbounds double, ptr %93, i64 %index
  %wide.load137 = load <2 x double>, ptr %169, align 8, !tbaa !9, !alias.scope !34
  %170 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat139, <2 x double> %wide.load137, <2 x double> %168)
  store <2 x double> %170, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %171 = getelementptr inbounds double, ptr %94, i64 %index
  %wide.load140 = load <2 x double>, ptr %171, align 8, !tbaa !9, !alias.scope !35
  %172 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat142, <2 x double> %wide.load140, <2 x double> %170)
  store <2 x double> %172, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %173 = getelementptr inbounds double, ptr %95, i64 %index
  %wide.load143 = load <2 x double>, ptr %173, align 8, !tbaa !9, !alias.scope !36
  %174 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat145, <2 x double> %wide.load143, <2 x double> %172)
  store <2 x double> %174, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %175 = getelementptr inbounds double, ptr %.pre, i64 %index
  %wide.load146 = load <2 x double>, ptr %175, align 8, !tbaa !9, !alias.scope !37
  %176 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat148, <2 x double> %wide.load146, <2 x double> %174)
  store <2 x double> %176, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %177 = getelementptr inbounds double, ptr %96, i64 %index
  %wide.load149 = load <2 x double>, ptr %177, align 8, !tbaa !9, !alias.scope !38
  %178 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat151, <2 x double> %wide.load149, <2 x double> %176)
  store <2 x double> %178, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %179 = getelementptr inbounds double, ptr %97, i64 %index
  %wide.load152 = load <2 x double>, ptr %179, align 8, !tbaa !9, !alias.scope !39
  %180 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat154, <2 x double> %wide.load152, <2 x double> %178)
  store <2 x double> %180, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %181 = getelementptr inbounds double, ptr %98, i64 %index
  %wide.load155 = load <2 x double>, ptr %181, align 8, !tbaa !9, !alias.scope !40
  %182 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat157, <2 x double> %wide.load155, <2 x double> %180)
  store <2 x double> %182, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %183 = getelementptr inbounds double, ptr %99, i64 %index
  %wide.load158 = load <2 x double>, ptr %183, align 8, !tbaa !9, !alias.scope !41
  %184 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat160, <2 x double> %wide.load158, <2 x double> %182)
  store <2 x double> %184, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %185 = getelementptr inbounds double, ptr %100, i64 %index
  %wide.load161 = load <2 x double>, ptr %185, align 8, !tbaa !9, !alias.scope !42
  %186 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat163, <2 x double> %wide.load161, <2 x double> %184)
  store <2 x double> %186, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %187 = getelementptr inbounds double, ptr %101, i64 %index
  %wide.load164 = load <2 x double>, ptr %187, align 8, !tbaa !9, !alias.scope !43
  %188 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat166, <2 x double> %wide.load164, <2 x double> %186)
  store <2 x double> %188, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %189 = getelementptr inbounds double, ptr %102, i64 %index
  %wide.load167 = load <2 x double>, ptr %189, align 8, !tbaa !9, !alias.scope !44
  %190 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat169, <2 x double> %wide.load167, <2 x double> %188)
  store <2 x double> %190, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %191 = getelementptr inbounds double, ptr %103, i64 %index
  %wide.load170 = load <2 x double>, ptr %191, align 8, !tbaa !9, !alias.scope !45
  %192 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat172, <2 x double> %wide.load170, <2 x double> %190)
  store <2 x double> %192, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %193 = getelementptr inbounds double, ptr %104, i64 %index
  %wide.load173 = load <2 x double>, ptr %193, align 8, !tbaa !9, !alias.scope !46
  %194 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat175, <2 x double> %wide.load173, <2 x double> %192)
  store <2 x double> %194, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %195 = getelementptr inbounds double, ptr %105, i64 %index
  %wide.load176 = load <2 x double>, ptr %195, align 8, !tbaa !9, !alias.scope !47
  %196 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat178, <2 x double> %wide.load176, <2 x double> %194)
  store <2 x double> %196, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %197 = getelementptr inbounds double, ptr %71, i64 %index
  %wide.load179 = load <2 x double>, ptr %197, align 8, !tbaa !9, !alias.scope !48
  %198 = tail call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %broadcast.splat181, <2 x double> %wide.load179, <2 x double> %196)
  store <2 x double> %198, ptr %166, align 8, !tbaa !9, !alias.scope !14, !noalias !16
  %index.next = add nuw i64 %index, 2
  %199 = icmp eq i64 %index.next, 16
  br i1 %199, label %middle.block, label %vector.body, !llvm.loop !49

200:                                              ; preds = %middle.block
  ret ptr %2

.preheader:                                       ; preds = %.preheader25, %.preheader
  %indvars.iv = phi i64 [ %indvars.iv.next, %.preheader ], [ 0, %.preheader25 ]
  %201 = getelementptr inbounds double, ptr %121, i64 %indvars.iv
  %.promoted = load double, ptr %201, align 8, !tbaa !9
  %202 = load double, ptr %123, align 8, !tbaa !9
  %203 = getelementptr inbounds double, ptr %106, i64 %indvars.iv
  %204 = load double, ptr %203, align 8, !tbaa !9
  %205 = tail call double @llvm.fmuladd.f64(double %202, double %204, double %.promoted)
  store double %205, ptr %201, align 8, !tbaa !9
  %206 = load double, ptr %124, align 8, !tbaa !9
  %207 = getelementptr inbounds double, ptr %107, i64 %indvars.iv
  %208 = load double, ptr %207, align 8, !tbaa !9
  %209 = tail call double @llvm.fmuladd.f64(double %206, double %208, double %205)
  store double %209, ptr %201, align 8, !tbaa !9
  %210 = load double, ptr %125, align 8, !tbaa !9
  %211 = getelementptr inbounds double, ptr %108, i64 %indvars.iv
  %212 = load double, ptr %211, align 8, !tbaa !9
  %213 = tail call double @llvm.fmuladd.f64(double %210, double %212, double %209)
  store double %213, ptr %201, align 8, !tbaa !9
  %214 = load double, ptr %126, align 8, !tbaa !9
  %215 = getelementptr inbounds double, ptr %109, i64 %indvars.iv
  %216 = load double, ptr %215, align 8, !tbaa !9
  %217 = tail call double @llvm.fmuladd.f64(double %214, double %216, double %213)
  store double %217, ptr %201, align 8, !tbaa !9
  %218 = load double, ptr %127, align 8, !tbaa !9
  %219 = getelementptr inbounds double, ptr %.pre, i64 %indvars.iv
  %220 = load double, ptr %219, align 8, !tbaa !9
  %221 = tail call double @llvm.fmuladd.f64(double %218, double %220, double %217)
  store double %221, ptr %201, align 8, !tbaa !9
  %222 = load double, ptr %128, align 8, !tbaa !9
  %223 = getelementptr inbounds double, ptr %110, i64 %indvars.iv
  %224 = load double, ptr %223, align 8, !tbaa !9
  %225 = tail call double @llvm.fmuladd.f64(double %222, double %224, double %221)
  store double %225, ptr %201, align 8, !tbaa !9
  %226 = load double, ptr %129, align 8, !tbaa !9
  %227 = getelementptr inbounds double, ptr %111, i64 %indvars.iv
  %228 = load double, ptr %227, align 8, !tbaa !9
  %229 = tail call double @llvm.fmuladd.f64(double %226, double %228, double %225)
  store double %229, ptr %201, align 8, !tbaa !9
  %230 = load double, ptr %130, align 8, !tbaa !9
  %231 = getelementptr inbounds double, ptr %112, i64 %indvars.iv
  %232 = load double, ptr %231, align 8, !tbaa !9
  %233 = tail call double @llvm.fmuladd.f64(double %230, double %232, double %229)
  store double %233, ptr %201, align 8, !tbaa !9
  %234 = load double, ptr %131, align 8, !tbaa !9
  %235 = getelementptr inbounds double, ptr %113, i64 %indvars.iv
  %236 = load double, ptr %235, align 8, !tbaa !9
  %237 = tail call double @llvm.fmuladd.f64(double %234, double %236, double %233)
  store double %237, ptr %201, align 8, !tbaa !9
  %238 = load double, ptr %132, align 8, !tbaa !9
  %239 = getelementptr inbounds double, ptr %114, i64 %indvars.iv
  %240 = load double, ptr %239, align 8, !tbaa !9
  %241 = tail call double @llvm.fmuladd.f64(double %238, double %240, double %237)
  store double %241, ptr %201, align 8, !tbaa !9
  %242 = load double, ptr %133, align 8, !tbaa !9
  %243 = getelementptr inbounds double, ptr %115, i64 %indvars.iv
  %244 = load double, ptr %243, align 8, !tbaa !9
  %245 = tail call double @llvm.fmuladd.f64(double %242, double %244, double %241)
  store double %245, ptr %201, align 8, !tbaa !9
  %246 = load double, ptr %134, align 8, !tbaa !9
  %247 = getelementptr inbounds double, ptr %116, i64 %indvars.iv
  %248 = load double, ptr %247, align 8, !tbaa !9
  %249 = tail call double @llvm.fmuladd.f64(double %246, double %248, double %245)
  store double %249, ptr %201, align 8, !tbaa !9
  %250 = load double, ptr %135, align 8, !tbaa !9
  %251 = getelementptr inbounds double, ptr %117, i64 %indvars.iv
  %252 = load double, ptr %251, align 8, !tbaa !9
  %253 = tail call double @llvm.fmuladd.f64(double %250, double %252, double %249)
  store double %253, ptr %201, align 8, !tbaa !9
  %254 = load double, ptr %136, align 8, !tbaa !9
  %255 = getelementptr inbounds double, ptr %118, i64 %indvars.iv
  %256 = load double, ptr %255, align 8, !tbaa !9
  %257 = tail call double @llvm.fmuladd.f64(double %254, double %256, double %253)
  store double %257, ptr %201, align 8, !tbaa !9
  %258 = load double, ptr %137, align 8, !tbaa !9
  %259 = getelementptr inbounds double, ptr %119, i64 %indvars.iv
  %260 = load double, ptr %259, align 8, !tbaa !9
  %261 = tail call double @llvm.fmuladd.f64(double %258, double %260, double %257)
  store double %261, ptr %201, align 8, !tbaa !9
  %262 = load double, ptr %138, align 8, !tbaa !9
  %263 = getelementptr inbounds double, ptr %71, i64 %indvars.iv
  %264 = load double, ptr %263, align 8, !tbaa !9
  %265 = tail call double @llvm.fmuladd.f64(double %262, double %264, double %261)
  store double %265, ptr %201, align 8, !tbaa !9
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, 16
  br i1 %exitcond.not, label %middle.block, label %.preheader, !llvm.loop !53

middle.block:                                     ; preds = %vector.body, %.preheader
  %indvars.iv.next35 = add nuw nsw i64 %indvars.iv34, 1
  %exitcond37.not = icmp eq i64 %indvars.iv.next35, 32
  br i1 %exitcond37.not, label %200, label %.preheader25, !llvm.loop !54
}

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"double", !7, i64 0}
!11 = !{!12}
!12 = distinct !{!12, !13}
!13 = distinct !{!13, !"LVerDomain"}
!14 = !{!15}
!15 = distinct !{!15, !13}
!16 = !{!12, !17, !18, !19, !20, !21, !22, !23, !24, !25, !26, !27, !28, !29, !30, !31, !32}
!17 = distinct !{!17, !13}
!18 = distinct !{!18, !13}
!19 = distinct !{!19, !13}
!20 = distinct !{!20, !13}
!21 = distinct !{!21, !13}
!22 = distinct !{!22, !13}
!23 = distinct !{!23, !13}
!24 = distinct !{!24, !13}
!25 = distinct !{!25, !13}
!26 = distinct !{!26, !13}
!27 = distinct !{!27, !13}
!28 = distinct !{!28, !13}
!29 = distinct !{!29, !13}
!30 = distinct !{!30, !13}
!31 = distinct !{!31, !13}
!32 = distinct !{!32, !13}
!33 = !{!17}
!34 = !{!18}
!35 = !{!19}
!36 = !{!20}
!37 = !{!21}
!38 = !{!22}
!39 = !{!23}
!40 = !{!24}
!41 = !{!25}
!42 = !{!26}
!43 = !{!27}
!44 = !{!28}
!45 = !{!29}
!46 = !{!30}
!47 = !{!31}
!48 = !{!32}
!49 = distinct !{!49, !50, !51, !52}
!50 = !{!"llvm.loop.mustprogress"}
!51 = !{!"llvm.loop.isvectorized", i32 1}
!52 = !{!"llvm.loop.unroll.runtime.disable"}
!53 = distinct !{!53, !50, !51}
!54 = distinct !{!54, !50}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalDCEPass,GlobalOptPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass