; LLVM IR from darnstrom/daqp :: src (auxiliary)

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

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

; Function Attrs: nocallback nofree nosync nounwind 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) #1

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

20:                                               ; preds = %109, %1
  %21 = load i32, ptr %3, align 4, !tbaa !13
  %22 = load ptr, ptr %2, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct.DAQPWorkspace, ptr %22, i32 0, i32 24
  %24 = load i32, ptr %23, align 8, !tbaa !14
  %25 = icmp slt i32 %21, %24
  br i1 %25, label %26, label %112

26:                                               ; preds = %20
  %27 = load ptr, ptr %2, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.DAQPWorkspace, ptr %27, i32 0, i32 9
  %29 = load ptr, ptr %28, align 8, !tbaa !15
  %30 = load ptr, ptr %2, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.DAQPWorkspace, ptr %30, i32 0, i32 23
  %32 = load ptr, ptr %31, align 8, !tbaa !16
  %33 = load i32, ptr %3, align 4, !tbaa !13
  %34 = sext i32 %33 to i64
  %35 = getelementptr inbounds i32, ptr %32, i64 %34
  %36 = load i32, ptr %35, align 4, !tbaa !13
  %37 = sext i32 %36 to i64
  %38 = getelementptr inbounds i32, ptr %29, i64 %37
  %39 = load i32, ptr %38, align 4, !tbaa !13
  %40 = and i32 %39, 2
  %41 = icmp ne i32 %40, 0
  br i1 %41, label %42, label %57

42:                                               ; preds = %26
  %43 = load ptr, ptr %2, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.DAQPWorkspace, ptr %43, i32 0, i32 6
  %45 = load ptr, ptr %44, align 8, !tbaa !17
  %46 = load ptr, ptr %2, align 8, !tbaa !5
  %47 = getelementptr inbounds %struct.DAQPWorkspace, ptr %46, i32 0, i32 23
  %48 = load ptr, ptr %47, align 8, !tbaa !16
  %49 = load i32, ptr %3, align 4, !tbaa !13
  %50 = sext i32 %49 to i64
  %51 = getelementptr inbounds i32, ptr %48, i64 %50
  %52 = load i32, ptr %51, align 4, !tbaa !13
  %53 = sext i32 %52 to i64
  %54 = getelementptr inbounds double, ptr %45, i64 %53
  %55 = load double, ptr %54, align 8, !tbaa !18
  %56 = fneg double %55
  store double %56, ptr %7, align 8, !tbaa !18
  br label %72

57:                                               ; preds = %26
  %58 = load ptr, ptr %2, align 8, !tbaa !5
  %59 = getelementptr inbounds %struct.DAQPWorkspace, ptr %58, i32 0, i32 5
  %60 = load ptr, ptr %59, align 8, !tbaa !19
  %61 = load ptr, ptr %2, align 8, !tbaa !5
  %62 = getelementptr inbounds %struct.DAQPWorkspace, ptr %61, i32 0, i32 23
  %63 = load ptr, ptr %62, align 8, !tbaa !16
  %64 = load i32, ptr %3, align 4, !tbaa !13
  %65 = sext i32 %64 to i64
  %66 = getelementptr inbounds i32, ptr %63, i64 %65
  %67 = load i32, ptr %66, align 4, !tbaa !13
  %68 = sext i32 %67 to i64
  %69 = getelementptr inbounds double, ptr %60, i64 %68
  %70 = load double, ptr %69, align 8, !tbaa !18
  %71 = fneg double %70
  store double %71, ptr %7, align 8, !tbaa !18
  br label %72

72:                                               ; preds = %57, %42
  store i32 0, ptr %4, align 4, !tbaa !13
  br label %73

73:                                               ; preds = %96, %72
  %74 = load i32, ptr %4, align 4, !tbaa !13
  %75 = load i32, ptr %3, align 4, !tbaa !13
  %76 = icmp slt i32 %74, %75
  br i1 %76, label %77, label %99

77:                                               ; preds = %73
  %78 = load ptr, ptr %2, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.DAQPWorkspace, ptr %78, i32 0, i32 18
  %80 = load ptr, ptr %79, align 8, !tbaa !20
  %81 = load i32, ptr %5, align 4, !tbaa !13
  %82 = add nsw i32 %81, 1
  store i32 %82, ptr %5, align 4, !tbaa !13
  %83 = sext i32 %81 to i64
  %84 = getelementptr inbounds double, ptr %80, i64 %83
  %85 = load double, ptr %84, align 8, !tbaa !18
  %86 = load ptr, ptr %2, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.DAQPWorkspace, ptr %86, i32 0, i32 20
  %88 = load ptr, ptr %87, align 8, !tbaa !21
  %89 = load i32, ptr %4, align 4, !tbaa !13
  %90 = sext i32 %89 to i64
  %91 = getelementptr inbounds double, ptr %88, i64 %90
  %92 = load double, ptr %91, align 8, !tbaa !18
  %93 = load double, ptr %7, align 8, !tbaa !18
  %94 = fneg double %85
  %95 = call double @llvm.fmuladd.f64(double %94, double %92, double %93)
  store double %95, ptr %7, align 8, !tbaa !18
  br label %96

96:                                               ; preds = %77
  %97 = load i32, ptr %4, align 4, !tbaa !13
  %98 = add nsw i32 %97, 1
  store i32 %98, ptr %4, align 4, !tbaa !13
  br label %73, !llvm.loop !22

99:                                               ; preds = %73
  %100 = load i32, ptr %5, align 4, !tbaa !13
  %101 = add nsw i32 %100, 1
  store i32 %101, ptr %5, align 4, !tbaa !13
  %102 = load double, ptr %7, align 8, !tbaa !18
  %103 = load ptr, ptr %2, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.DAQPWorkspace, ptr %103, i32 0, i32 20
  %105 = load ptr, ptr %104, align 8, !tbaa !21
  %106 = load i32, ptr %3, align 4, !tbaa !13
  %107 = sext i32 %106 to i64
  %108 = getelementptr inbounds double, ptr %105, i64 %107
  store double %102, ptr %108, align 8, !tbaa !18
  br label %109

109:                                              ; preds = %99
  %110 = load i32, ptr %3, align 4, !tbaa !13
  %111 = add nsw i32 %110, 1
  store i32 %111, ptr %3, align 4, !tbaa !13
  br label %20, !llvm.loop !24

112:                                              ; preds = %20
  %113 = load ptr, ptr %2, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.DAQPWorkspace, ptr %113, i32 0, i32 22
  %115 = load i32, ptr %114, align 8, !tbaa !9
  store i32 %115, ptr %3, align 4, !tbaa !13
  br label %116

116:                                              ; preds = %144, %112
  %117 = load i32, ptr %3, align 4, !tbaa !13
  %118 = load ptr, ptr %2, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.DAQPWorkspace, ptr %118, i32 0, i32 24
  %120 = load i32, ptr %119, align 8, !tbaa !14
  %121 = icmp slt i32 %117, %120
  br i1 %121, label %122, label %147

122:                                              ; preds = %116
  %123 = load ptr, ptr %2, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.DAQPWorkspace, ptr %123, i32 0, i32 20
  %125 = load ptr, ptr %124, align 8, !tbaa !21
  %126 = load i32, ptr %3, align 4, !tbaa !13
  %127 = sext i32 %126 to i64
  %128 = getelementptr inbounds double, ptr %125, i64 %127
  %129 = load double, ptr %128, align 8, !tbaa !18
  %130 = load ptr, ptr %2, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.DAQPWorkspace, ptr %130, i32 0, i32 19
  %132 = load ptr, ptr %131, align 8, !tbaa !25
  %133 = load i32, ptr %3, align 4, !tbaa !13
  %134 = sext i32 %133 to i64
  %135 = getelementptr inbounds double, ptr %132, i64 %134
  %136 = load double, ptr %135, align 8, !tbaa !18
  %137 = fdiv double %129, %136
  %138 = load ptr, ptr %2, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.DAQPWorkspace, ptr %138, i32 0, i32 21
  %140 = load ptr, ptr %139, align 8, !tbaa !26
  %141 = load i32, ptr %3, align 4, !tbaa !13
  %142 = sext i32 %141 to i64
  %143 = getelementptr inbounds double, ptr %140, i64 %142
  store double %137, ptr %143, align 8, !tbaa !18
  br label %144

144:                                              ; preds = %122
  %145 = load i32, ptr %3, align 4, !tbaa !13
  %146 = add nsw i32 %145, 1
  store i32 %146, ptr %3, align 4, !tbaa !13
  br label %116, !llvm.loop !27

147:                                              ; preds = %116
  %148 = load ptr, ptr %2, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.DAQPWorkspace, ptr %148, i32 0, i32 24
  %150 = load i32, ptr %149, align 8, !tbaa !14
  %151 = load ptr, ptr %2, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.DAQPWorkspace, ptr %151, i32 0, i32 24
  %153 = load i32, ptr %152, align 8, !tbaa !14
  %154 = add nsw i32 %153, 1
  %155 = mul nsw i32 %150, %154
  %156 = sdiv i32 %155, 2
  %157 = sub nsw i32 %156, 1
  store i32 %157, ptr %6, align 4, !tbaa !13
  %158 = load ptr, ptr %2, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.DAQPWorkspace, ptr %158, i32 0, i32 24
  %160 = load i32, ptr %159, align 8, !tbaa !14
  %161 = sub nsw i32 %160, 1
  store i32 %161, ptr %3, align 4, !tbaa !13
  br label %162

162:                                              ; preds = %215, %147
  %163 = load i32, ptr %3, align 4, !tbaa !13
  %164 = icmp sge i32 %163, 0
  br i1 %164, label %165, label %218

165:                                              ; preds = %162
  %166 = load ptr, ptr %2, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.DAQPWorkspace, ptr %166, i32 0, i32 21
  %168 = load ptr, ptr %167, align 8, !tbaa !26
  %169 = load i32, ptr %3, align 4, !tbaa !13
  %170 = sext i32 %169 to i64
  %171 = getelementptr inbounds double, ptr %168, i64 %170
  %172 = load double, ptr %171, align 8, !tbaa !18
  store double %172, ptr %7, align 8, !tbaa !18
  %173 = load i32, ptr %6, align 4, !tbaa !13
  %174 = add nsw i32 %173, -1
  store i32 %174, ptr %6, align 4, !tbaa !13
  store i32 %173, ptr %5, align 4, !tbaa !13
  %175 = load ptr, ptr %2, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.DAQPWorkspace, ptr %175, i32 0, i32 24
  %177 = load i32, ptr %176, align 8, !tbaa !14
  %178 = sub nsw i32 %177, 1
  store i32 %178, ptr %4, align 4, !tbaa !13
  br label %179

179:                                              ; preds = %204, %165
  %180 = load i32, ptr %4, align 4, !tbaa !13
  %181 = load i32, ptr %3, align 4, !tbaa !13
  %182 = icmp sgt i32 %180, %181
  br i1 %182, label %183, label %207

183:                                              ; preds = %179
  %184 = load ptr, ptr %2, align 8, !tbaa !5
  %185 = getelementptr inbounds %struct.DAQPWorkspace, ptr %184, i32 0, i32 15
  %186 = load ptr, ptr %185, align 8, !tbaa !28
  %187 = load i32, ptr %4, align 4, !tbaa !13
  %188 = sext i32 %187 to i64
  %189 = getelementptr inbounds double, ptr %186, i64 %188
  %190 = load double, ptr %189, align 8, !tbaa !18
  %191 = load ptr, ptr %2, align 8, !tbaa !5
  %192 = getelementptr inbounds %struct.DAQPWorkspace, ptr %191, i32 0, i32 18
  %193 = load ptr, ptr %192, align 8, !tbaa !20
  %194 = load i32, ptr %5, align 4, !tbaa !13
  %195 = sext i32 %194 to i64
  %196 = getelementptr inbounds double, ptr %193, i64 %195
  %197 = load double, ptr %196, align 8, !tbaa !18
  %198 = load double, ptr %7, align 8, !tbaa !18
  %199 = fneg double %190
  %200 = call double @llvm.fmuladd.f64(double %199, double %197, double %198)
  store double %200, ptr %7, align 8, !tbaa !18
  %201 = load i32, ptr %4, align 4, !tbaa !13
  %202 = load i32, ptr %5, align 4, !tbaa !13
  %203 = sub nsw i32 %202, %201
  store i32 %203, ptr %5, align 4, !tbaa !13
  br label %204

204:                                              ; preds = %183
  %205 = load i32, ptr %4, align 4, !tbaa !13
  %206 = add nsw i32 %205, -1
  store i32 %206, ptr %4, align 4, !tbaa !13
  br label %179, !llvm.loop !29

207:                                              ; preds = %179
  %208 = load double, ptr %7, align 8, !tbaa !18
  %209 = load ptr, ptr %2, align 8, !tbaa !5
  %210 = getelementptr inbounds %struct.DAQPWorkspace, ptr %209, i32 0, i32 15
  %211 = load ptr, ptr %210, align 8, !tbaa !28
  %212 = load i32, ptr %3, align 4, !tbaa !13
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds double, ptr %211, i64 %213
  store double %208, ptr %214, align 8, !tbaa !18
  br label %215

215:                                              ; preds = %207
  %216 = load i32, ptr %3, align 4, !tbaa !13
  %217 = add nsw i32 %216, -1
  store i32 %217, ptr %3, align 4, !tbaa !13
  br label %162, !llvm.loop !30

218:                                              ; preds = %162
  %219 = load ptr, ptr %2, align 8, !tbaa !5
  %220 = getelementptr inbounds %struct.DAQPWorkspace, ptr %219, i32 0, i32 24
  %221 = load i32, ptr %220, align 8, !tbaa !14
  %222 = load ptr, ptr %2, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct.DAQPWorkspace, ptr %222, i32 0, i32 22
  store i32 %221, ptr %223, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #3
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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, !11, i64 168}
!10 = !{!"", !6, i64 0, !11, i64 8, !11, i64 12, !11, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !12, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !11, i64 168, !6, i64 176, !11, i64 184, !11, i64 188, !11, i64 192, !12, i64 200, !6, i64 208, !6, i64 216, !11, i64 224, !6, i64 232}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!11, !11, i64 0}
!14 = !{!10, !11, i64 184}
!15 = !{!10, !6, i64 64}
!16 = !{!10, !6, i64 176}
!17 = !{!10, !6, i64 40}
!18 = !{!12, !12, i64 0}
!19 = !{!10, !6, i64 32}
!20 = !{!10, !6, i64 136}
!21 = !{!10, !6, i64 152}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = distinct !{!24, !23}
!25 = !{!10, !6, i64 144}
!26 = !{!10, !6, i64 160}
!27 = distinct !{!27, !23}
!28 = !{!10, !6, i64 112}
!29 = distinct !{!29, !23}
!30 = distinct !{!30, !23}


; 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 nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #0

; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) uwtable
define dso_local void @compute_CSP(ptr nocapture noundef %0) local_unnamed_addr #1 {
  %2 = getelementptr inbounds i8, ptr %0, i64 168
  %3 = load i32, ptr %2, align 8, !tbaa !5
  %4 = getelementptr inbounds i8, ptr %0, i64 184
  %5 = load i32, ptr %4, align 8, !tbaa !12
  %6 = icmp slt i32 %3, %5
  br i1 %6, label %.lr.ph77, label %._crit_edge81

.lr.ph77:                                         ; preds = %1
  %7 = add nsw i32 %3, 1
  %8 = mul nsw i32 %7, %3
  %9 = sdiv i32 %8, 2
  %10 = getelementptr inbounds i8, ptr %0, i64 64
  %11 = load ptr, ptr %10, align 8, !tbaa !13
  %12 = getelementptr inbounds i8, ptr %0, i64 176
  %13 = load ptr, ptr %12, align 8, !tbaa !14
  %14 = getelementptr inbounds i8, ptr %0, i64 136
  %15 = getelementptr inbounds i8, ptr %0, i64 152
  %16 = load ptr, ptr %15, align 8, !tbaa !15
  %17 = sext i32 %3 to i64
  %wide.trip.count107 = sext i32 %5 to i64
  br label %45

.preheader:                                       ; preds = %._crit_edge
  br i1 %6, label %.lr.ph80, label %._crit_edge81

.lr.ph80:                                         ; preds = %.preheader
  %18 = getelementptr inbounds i8, ptr %0, i64 152
  %19 = load ptr, ptr %18, align 8, !tbaa !15
  %20 = getelementptr inbounds i8, ptr %0, i64 144
  %21 = load ptr, ptr %20, align 8, !tbaa !16
  %22 = getelementptr inbounds i8, ptr %0, i64 160
  %23 = load ptr, ptr %22, align 8, !tbaa !17
  %24 = sext i32 %3 to i64
  %wide.trip.count112 = sext i32 %5 to i64
  %25 = sub nsw i64 %wide.trip.count107, %17
  %min.iters.check = icmp ult i64 %25, 2
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.memcheck

scalar.ph.preheader:                              ; preds = %middle.block, %vector.memcheck, %.lr.ph80
  %indvars.iv109.ph = phi i64 [ %24, %vector.memcheck ], [ %24, %.lr.ph80 ], [ %ind.end, %middle.block ]
  %26 = sub nsw i64 %wide.trip.count107, %indvars.iv109.ph
  %xtraiter129 = and i64 %26, 3
  %lcmp.mod130.not = icmp eq i64 %xtraiter129, 0
  br i1 %lcmp.mod130.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader, %scalar.ph.prol
  %indvars.iv109.prol = phi i64 [ %indvars.iv.next110.prol, %scalar.ph.prol ], [ %indvars.iv109.ph, %scalar.ph.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph.prol ], [ 0, %scalar.ph.preheader ]
  %27 = getelementptr inbounds double, ptr %19, i64 %indvars.iv109.prol
  %28 = load double, ptr %27, align 8, !tbaa !18
  %29 = getelementptr inbounds double, ptr %21, i64 %indvars.iv109.prol
  %30 = load double, ptr %29, align 8, !tbaa !18
  %31 = fdiv double %28, %30
  %32 = getelementptr inbounds double, ptr %23, i64 %indvars.iv109.prol
  store double %31, ptr %32, align 8, !tbaa !18
  %indvars.iv.next110.prol = add nsw i64 %indvars.iv109.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter129
  br i1 %prol.iter.cmp.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol, !llvm.loop !19

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv109.unr = phi i64 [ %indvars.iv109.ph, %scalar.ph.preheader ], [ %indvars.iv.next110.prol, %scalar.ph.prol ]
  %33 = sub nsw i64 %indvars.iv109.ph, %wide.trip.count107
  %34 = icmp ugt i64 %33, -4
  br i1 %34, label %._crit_edge81, label %scalar.ph

vector.memcheck:                                  ; preds = %.lr.ph80
  %35 = ptrtoint ptr %23 to i64
  %36 = ptrtoint ptr %21 to i64
  %37 = ptrtoint ptr %19 to i64
  %38 = sub i64 %35, %37
  %diff.check = icmp ult i64 %38, 16
  %39 = sub i64 %35, %36
  %diff.check124 = icmp ult i64 %39, 16
  %conflict.rdx = or i1 %diff.check, %diff.check124
  br i1 %conflict.rdx, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %25, -2
  %ind.end = add nsw i64 %n.vec, %24
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %offset.idx = add i64 %index, %24
  %40 = getelementptr inbounds double, ptr %19, i64 %offset.idx
  %wide.load = load <2 x double>, ptr %40, align 8, !tbaa !18
  %41 = getelementptr inbounds double, ptr %21, i64 %offset.idx
  %wide.load125 = load <2 x double>, ptr %41, align 8, !tbaa !18
  %42 = fdiv <2 x double> %wide.load, %wide.load125
  %43 = getelementptr inbounds double, ptr %23, i64 %offset.idx
  store <2 x double> %42, ptr %43, align 8, !tbaa !18
  %index.next = add nuw i64 %index, 2
  %44 = icmp eq i64 %index.next, %n.vec
  br i1 %44, label %middle.block, label %vector.body, !llvm.loop !21

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

45:                                               ; preds = %.lr.ph77, %._crit_edge
  %indvar = phi i32 [ 0, %.lr.ph77 ], [ %indvar.next, %._crit_edge ]
  %indvars.iv104 = phi i64 [ %17, %.lr.ph77 ], [ %indvars.iv.next105, %._crit_edge ]
  %.06175 = phi i32 [ %9, %.lr.ph77 ], [ %81, %._crit_edge ]
  %46 = add i32 %3, %indvar
  %47 = zext i32 %46 to i64
  %48 = getelementptr inbounds i32, ptr %13, i64 %indvars.iv104
  %49 = load i32, ptr %48, align 4, !tbaa !25
  %50 = sext i32 %49 to i64
  %51 = getelementptr inbounds i32, ptr %11, i64 %50
  %52 = load i32, ptr %51, align 4, !tbaa !25
  %53 = and i32 %52, 2
  %.not = icmp eq i32 %53, 0
  %..v = select i1 %.not, i64 32, i64 40
  %. = getelementptr inbounds i8, ptr %0, i64 %..v
  %54 = load ptr, ptr %., align 8, !tbaa !26
  %55 = getelementptr inbounds double, ptr %54, i64 %50
  %56 = load double, ptr %55, align 8, !tbaa !18
  %57 = fneg double %56
  %58 = icmp sgt i64 %indvars.iv104, 0
  br i1 %58, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %45
  %59 = load ptr, ptr %14, align 8, !tbaa !27
  %60 = sext i32 %.06175 to i64
  %xtraiter = and i64 %47, 1
  %61 = icmp eq i32 %46, 1
  br i1 %61, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph.new

.lr.ph.new:                                       ; preds = %.lr.ph
  %unroll_iter = and i64 %47, 4294967294
  %invariant.gep = getelementptr i8, ptr %59, i64 8
  br label %62

62:                                               ; preds = %62, %.lr.ph.new
  %indvars.iv99 = phi i64 [ 0, %.lr.ph.new ], [ %indvars.iv.next100.1, %62 ]
  %indvars.iv = phi i64 [ %60, %.lr.ph.new ], [ %indvars.iv.next.1, %62 ]
  %.172 = phi double [ %57, %.lr.ph.new ], [ %73, %62 ]
  %niter = phi i64 [ 0, %.lr.ph.new ], [ %niter.next.1, %62 ]
  %63 = getelementptr inbounds double, ptr %59, i64 %indvars.iv
  %64 = load double, ptr %63, align 8, !tbaa !18
  %65 = getelementptr inbounds double, ptr %16, i64 %indvars.iv99
  %66 = load double, ptr %65, align 8, !tbaa !18
  %67 = fneg double %64
  %68 = tail call double @llvm.fmuladd.f64(double %67, double %66, double %.172)
  %indvars.iv.next100 = or disjoint i64 %indvars.iv99, 1
  %indvars.iv.next.1 = add nsw i64 %indvars.iv, 2
  %gep = getelementptr double, ptr %invariant.gep, i64 %indvars.iv
  %69 = load double, ptr %gep, align 8, !tbaa !18
  %70 = getelementptr inbounds double, ptr %16, i64 %indvars.iv.next100
  %71 = load double, ptr %70, align 8, !tbaa !18
  %72 = fneg double %69
  %73 = tail call double @llvm.fmuladd.f64(double %72, double %71, double %68)
  %indvars.iv.next100.1 = add nuw nsw i64 %indvars.iv99, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %._crit_edge.loopexit.unr-lcssa, label %62, !llvm.loop !28

._crit_edge.loopexit.unr-lcssa:                   ; preds = %62, %.lr.ph
  %indvars.iv.next.lcssa.ph = phi i64 [ poison, %.lr.ph ], [ %indvars.iv.next.1, %62 ]
  %.lcssa126.ph = phi double [ poison, %.lr.ph ], [ %73, %62 ]
  %indvars.iv99.unr = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next100.1, %62 ]
  %indvars.iv.unr = phi i64 [ %60, %.lr.ph ], [ %indvars.iv.next.1, %62 ]
  %.172.unr = phi double [ %57, %.lr.ph ], [ %73, %62 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge.loopexit, label %._crit_edge.loopexit.epilog-lcssa

._crit_edge.loopexit.epilog-lcssa:                ; preds = %._crit_edge.loopexit.unr-lcssa
  %indvars.iv.next.epil = add nsw i64 %indvars.iv.unr, 1
  %74 = getelementptr inbounds double, ptr %59, i64 %indvars.iv.unr
  %75 = load double, ptr %74, align 8, !tbaa !18
  %76 = getelementptr inbounds double, ptr %16, i64 %indvars.iv99.unr
  %77 = load double, ptr %76, align 8, !tbaa !18
  %78 = fneg double %75
  %79 = tail call double @llvm.fmuladd.f64(double %78, double %77, double %.172.unr)
  br label %._crit_edge.loopexit

._crit_edge.loopexit:                             ; preds = %._crit_edge.loopexit.unr-lcssa, %._crit_edge.loopexit.epilog-lcssa
  %indvars.iv.next.lcssa = phi i64 [ %indvars.iv.next.lcssa.ph, %._crit_edge.loopexit.unr-lcssa ], [ %indvars.iv.next.epil, %._crit_edge.loopexit.epilog-lcssa ]
  %.lcssa126 = phi double [ %.lcssa126.ph, %._crit_edge.loopexit.unr-lcssa ], [ %79, %._crit_edge.loopexit.epilog-lcssa ]
  %80 = trunc nsw i64 %indvars.iv.next.lcssa to i32
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %45
  %.162.lcssa = phi i32 [ %.06175, %45 ], [ %80, %._crit_edge.loopexit ]
  %.1.lcssa = phi double [ %57, %45 ], [ %.lcssa126, %._crit_edge.loopexit ]
  %81 = add nsw i32 %.162.lcssa, 1
  %82 = getelementptr inbounds double, ptr %16, i64 %indvars.iv104
  store double %.1.lcssa, ptr %82, align 8, !tbaa !18
  %indvars.iv.next105 = add nsw i64 %indvars.iv104, 1
  %exitcond108.not = icmp eq i64 %indvars.iv.next105, %wide.trip.count107
  %indvar.next = add i32 %indvar, 1
  br i1 %exitcond108.not, label %.preheader, label %45, !llvm.loop !29

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv109 = phi i64 [ %indvars.iv.next110.3, %scalar.ph ], [ %indvars.iv109.unr, %scalar.ph.prol.loopexit ]
  %83 = getelementptr inbounds double, ptr %19, i64 %indvars.iv109
  %84 = load double, ptr %83, align 8, !tbaa !18
  %85 = getelementptr inbounds double, ptr %21, i64 %indvars.iv109
  %86 = load double, ptr %85, align 8, !tbaa !18
  %87 = fdiv double %84, %86
  %88 = getelementptr inbounds double, ptr %23, i64 %indvars.iv109
  store double %87, ptr %88, align 8, !tbaa !18
  %indvars.iv.next110 = add nsw i64 %indvars.iv109, 1
  %89 = getelementptr inbounds double, ptr %19, i64 %indvars.iv.next110
  %90 = load double, ptr %89, align 8, !tbaa !18
  %91 = getelementptr inbounds double, ptr %21, i64 %indvars.iv.next110
  %92 = load double, ptr %91, align 8, !tbaa !18
  %93 = fdiv double %90, %92
  %94 = getelementptr inbounds double, ptr %23, i64 %indvars.iv.next110
  store double %93, ptr %94, align 8, !tbaa !18
  %indvars.iv.next110.1 = add nsw i64 %indvars.iv109, 2
  %95 = getelementptr inbounds double, ptr %19, i64 %indvars.iv.next110.1
  %96 = load double, ptr %95, align 8, !tbaa !18
  %97 = getelementptr inbounds double, ptr %21, i64 %indvars.iv.next110.1
  %98 = load double, ptr %97, align 8, !tbaa !18
  %99 = fdiv double %96, %98
  %100 = getelementptr inbounds double, ptr %23, i64 %indvars.iv.next110.1
  store double %99, ptr %100, align 8, !tbaa !18
  %indvars.iv.next110.2 = add nsw i64 %indvars.iv109, 3
  %101 = getelementptr inbounds double, ptr %19, i64 %indvars.iv.next110.2
  %102 = load double, ptr %101, align 8, !tbaa !18
  %103 = getelementptr inbounds double, ptr %21, i64 %indvars.iv.next110.2
  %104 = load double, ptr %103, align 8, !tbaa !18
  %105 = fdiv double %102, %104
  %106 = getelementptr inbounds double, ptr %23, i64 %indvars.iv.next110.2
  store double %105, ptr %106, align 8, !tbaa !18
  %indvars.iv.next110.3 = add nsw i64 %indvars.iv109, 4
  %exitcond113.not.3 = icmp eq i64 %indvars.iv.next110.3, %wide.trip.count112
  br i1 %exitcond113.not.3, label %._crit_edge81, label %scalar.ph, !llvm.loop !30

._crit_edge81:                                    ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block, %1, %.preheader
  %107 = icmp sgt i32 %5, 0
  br i1 %107, label %.lr.ph95, label %._crit_edge96

.lr.ph95:                                         ; preds = %._crit_edge81
  %108 = add nuw nsw i32 %5, 1
  %109 = mul nuw nsw i32 %108, %5
  %110 = lshr i32 %109, 1
  %111 = getelementptr inbounds i8, ptr %0, i64 160
  %112 = load ptr, ptr %111, align 8, !tbaa !17
  %113 = getelementptr inbounds i8, ptr %0, i64 112
  %114 = getelementptr inbounds i8, ptr %0, i64 136
  %115 = load ptr, ptr %113, align 8, !tbaa !31
  %116 = zext nneg i32 %5 to i64
  %indvars.iv.next115.prol = add nsw i64 %116, -1
  %117 = getelementptr inbounds double, ptr %115, i64 %indvars.iv.next115.prol
  %118 = trunc nsw i64 %indvars.iv.next115.prol to i32
  br label %119

119:                                              ; preds = %.lr.ph95, %._crit_edge87
  %indvar131 = phi i64 [ 0, %.lr.ph95 ], [ %indvar.next132, %._crit_edge87 ]
  %indvars.iv117 = phi i64 [ %116, %.lr.ph95 ], [ %indvars.iv.next118, %._crit_edge87 ]
  %.06092.in = phi i32 [ %110, %.lr.ph95 ], [ %.06092, %._crit_edge87 ]
  %.06092 = add nsw i32 %.06092.in, -1
  %indvars.iv.next118 = add nsw i64 %indvars.iv117, -1
  %120 = getelementptr inbounds double, ptr %112, i64 %indvars.iv.next118
  %121 = load double, ptr %120, align 8, !tbaa !18
  %122 = icmp slt i64 %indvars.iv117, %116
  br i1 %122, label %.lr.ph86, label %._crit_edge87

.lr.ph86:                                         ; preds = %119
  %123 = load ptr, ptr %114, align 8, !tbaa !27
  %xtraiter133 = and i64 %indvar131, 1
  %lcmp.mod134.not = icmp eq i64 %xtraiter133, 0
  br i1 %lcmp.mod134.not, label %.prol.loopexit, label %.prol.loopexit.unr-lcssa

.prol.loopexit.unr-lcssa:                         ; preds = %.lr.ph86
  %124 = load double, ptr %117, align 8, !tbaa !18
  %125 = sext i32 %.06092 to i64
  %126 = getelementptr inbounds double, ptr %123, i64 %125
  %127 = load double, ptr %126, align 8, !tbaa !18
  %128 = fneg double %124
  %129 = tail call double @llvm.fmuladd.f64(double %128, double %127, double %121)
  %130 = sub nsw i32 %.06092, %118
  br label %.prol.loopexit

.prol.loopexit:                                   ; preds = %.prol.loopexit.unr-lcssa, %.lr.ph86
  %indvars.iv114.unr = phi i64 [ %116, %.lr.ph86 ], [ %indvars.iv.next115.prol, %.prol.loopexit.unr-lcssa ]
  %.284.unr = phi double [ %121, %.lr.ph86 ], [ %129, %.prol.loopexit.unr-lcssa ]
  %.26383.unr = phi i32 [ %.06092, %.lr.ph86 ], [ %130, %.prol.loopexit.unr-lcssa ]
  %.lcssa.unr = phi double [ poison, %.lr.ph86 ], [ %129, %.prol.loopexit.unr-lcssa ]
  %131 = icmp eq i64 %indvar131, 1
  br i1 %131, label %._crit_edge87, label %.lr.ph86.new

.lr.ph86.new:                                     ; preds = %.prol.loopexit, %.lr.ph86.new
  %indvars.iv114 = phi i64 [ %indvars.iv.next115.1, %.lr.ph86.new ], [ %indvars.iv114.unr, %.prol.loopexit ]
  %.284 = phi double [ %147, %.lr.ph86.new ], [ %.284.unr, %.prol.loopexit ]
  %.26383 = phi i32 [ %149, %.lr.ph86.new ], [ %.26383.unr, %.prol.loopexit ]
  %indvars.iv.next115 = add nsw i64 %indvars.iv114, -1
  %132 = getelementptr inbounds double, ptr %115, i64 %indvars.iv.next115
  %133 = load double, ptr %132, align 8, !tbaa !18
  %134 = sext i32 %.26383 to i64
  %135 = getelementptr inbounds double, ptr %123, i64 %134
  %136 = load double, ptr %135, align 8, !tbaa !18
  %137 = fneg double %133
  %138 = tail call double @llvm.fmuladd.f64(double %137, double %136, double %.284)
  %139 = trunc nsw i64 %indvars.iv.next115 to i32
  %140 = sub nsw i32 %.26383, %139
  %indvars.iv.next115.1 = add nsw i64 %indvars.iv114, -2
  %141 = getelementptr inbounds double, ptr %115, i64 %indvars.iv.next115.1
  %142 = load double, ptr %141, align 8, !tbaa !18
  %143 = sext i32 %140 to i64
  %144 = getelementptr inbounds double, ptr %123, i64 %143
  %145 = load double, ptr %144, align 8, !tbaa !18
  %146 = fneg double %142
  %147 = tail call double @llvm.fmuladd.f64(double %146, double %145, double %138)
  %148 = trunc nsw i64 %indvars.iv.next115.1 to i32
  %149 = sub nsw i32 %140, %148
  %150 = icmp sgt i64 %indvars.iv.next115.1, %indvars.iv117
  br i1 %150, label %.lr.ph86.new, label %._crit_edge87, !llvm.loop !32

._crit_edge87:                                    ; preds = %.prol.loopexit, %.lr.ph86.new, %119
  %.2.lcssa = phi double [ %121, %119 ], [ %.lcssa.unr, %.prol.loopexit ], [ %147, %.lr.ph86.new ]
  %151 = getelementptr inbounds double, ptr %115, i64 %indvars.iv.next118
  store double %.2.lcssa, ptr %151, align 8, !tbaa !18
  %152 = icmp sgt i64 %indvars.iv117, 1
  %indvar.next132 = add i64 %indvar131, 1
  br i1 %152, label %119, label %._crit_edge96, !llvm.loop !33

._crit_edge96:                                    ; preds = %._crit_edge87, %._crit_edge81
  store i32 %5, ptr %2, align 8, !tbaa !5
  ret void
}

attributes #0 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #1 = { nofree norecurse nosync nounwind memory(readwrite, inaccessiblemem: none) 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" }

!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, !10, i64 168}
!6 = !{!"", !7, i64 0, !10, i64 8, !10, i64 12, !10, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !7, i64 88, !7, i64 96, !7, i64 104, !7, i64 112, !7, i64 120, !11, i64 128, !7, i64 136, !7, i64 144, !7, i64 152, !7, i64 160, !10, i64 168, !7, i64 176, !10, i64 184, !10, i64 188, !10, i64 192, !11, i64 200, !7, i64 208, !7, i64 216, !10, i64 224, !7, i64 232}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"double", !8, i64 0}
!12 = !{!6, !10, i64 184}
!13 = !{!6, !7, i64 64}
!14 = !{!6, !7, i64 176}
!15 = !{!6, !7, i64 152}
!16 = !{!6, !7, i64 144}
!17 = !{!6, !7, i64 160}
!18 = !{!11, !11, i64 0}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.unroll.disable"}
!21 = distinct !{!21, !22, !23, !24}
!22 = !{!"llvm.loop.mustprogress"}
!23 = !{!"llvm.loop.isvectorized", i32 1}
!24 = !{!"llvm.loop.unroll.runtime.disable"}
!25 = !{!10, !10, i64 0}
!26 = !{!7, !7, i64 0}
!27 = !{!6, !7, i64 136}
!28 = distinct !{!28, !22}
!29 = distinct !{!29, !22}
!30 = distinct !{!30, !22, !23}
!31 = !{!6, !7, i64 112}
!32 = distinct !{!32, !22}
!33 = distinct !{!33, !22}


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