; LLVM IR from aferikoglou/GenHLSOptimizer :: dataset/rodinia_lc_mgvf_0_baseline_0 (lc_mgvf)

; 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: mustprogress nounwind uwtable
declare dso_local float @heaviside(float noundef) #0

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

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

; Function Attrs: mustprogress uwtable
define dso_local float @lc_mgvf(ptr noundef %0, ptr noundef %1, ptr noundef %2) #2 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca float, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca float, align 4
  %12 = alloca float, align 4
  %13 = alloca float, align 4
  %14 = alloca float, align 4
  %15 = alloca float, align 4
  %16 = alloca float, align 4
  %17 = alloca float, align 4
  %18 = alloca float, align 4
  %19 = alloca float, align 4
  %20 = alloca float, align 4
  %21 = alloca float, align 4
  %22 = alloca float, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #5
  store float 0.000000e+00, ptr %7, align 4, !tbaa !9
  br label %23

23:                                               ; preds = %3
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #5
  store i32 0, ptr %8, align 4, !tbaa !11
  br label %24

24:                                               ; preds = %270, %23
  %25 = load i32, ptr %8, align 4, !tbaa !11
  %26 = icmp slt i32 %25, 1024
  br i1 %26, label %28, label %27

27:                                               ; preds = %24
  store i32 3, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #5
  br label %273

28:                                               ; preds = %24
  br label %29

29:                                               ; preds = %28
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #5
  store i32 0, ptr %10, align 4, !tbaa !11
  br label %30

30:                                               ; preds = %266, %29
  %31 = load i32, ptr %10, align 4, !tbaa !11
  %32 = icmp slt i32 %31, 1024
  br i1 %32, label %34, label %33

33:                                               ; preds = %30
  store i32 7, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  br label %269

34:                                               ; preds = %30
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #5
  %35 = load ptr, ptr %5, align 8, !tbaa !5
  %36 = load i32, ptr %8, align 4, !tbaa !11
  %37 = mul nsw i32 %36, 1024
  %38 = load i32, ptr %10, align 4, !tbaa !11
  %39 = add nsw i32 %37, %38
  %40 = sext i32 %39 to i64
  %41 = getelementptr inbounds float, ptr %35, i64 %40
  %42 = load float, ptr %41, align 4, !tbaa !9
  store float %42, ptr %11, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  %43 = load i32, ptr %8, align 4, !tbaa !11
  %44 = icmp eq i32 %43, 0
  br i1 %44, label %48, label %45

45:                                               ; preds = %34
  %46 = load i32, ptr %10, align 4, !tbaa !11
  %47 = icmp eq i32 %46, 0
  br i1 %47, label %48, label %49

48:                                               ; preds = %45, %34
  br label %62

49:                                               ; preds = %45
  %50 = load ptr, ptr %5, align 8, !tbaa !5
  %51 = load i32, ptr %8, align 4, !tbaa !11
  %52 = sub nsw i32 %51, 1
  %53 = mul nsw i32 %52, 1024
  %54 = load i32, ptr %10, align 4, !tbaa !11
  %55 = sub nsw i32 %54, 1
  %56 = add nsw i32 %53, %55
  %57 = sext i32 %56 to i64
  %58 = getelementptr inbounds float, ptr %50, i64 %57
  %59 = load float, ptr %58, align 4, !tbaa !9
  %60 = load float, ptr %11, align 4, !tbaa !9
  %61 = fsub float %59, %60
  br label %62

62:                                               ; preds = %49, %48
  %63 = phi float [ 0.000000e+00, %48 ], [ %61, %49 ]
  store float %63, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #5
  %64 = load i32, ptr %8, align 4, !tbaa !11
  %65 = icmp eq i32 %64, 0
  br i1 %65, label %66, label %67

66:                                               ; preds = %62
  br label %79

67:                                               ; preds = %62
  %68 = load ptr, ptr %5, align 8, !tbaa !5
  %69 = load i32, ptr %8, align 4, !tbaa !11
  %70 = sub nsw i32 %69, 1
  %71 = mul nsw i32 %70, 1024
  %72 = load i32, ptr %10, align 4, !tbaa !11
  %73 = add nsw i32 %71, %72
  %74 = sext i32 %73 to i64
  %75 = getelementptr inbounds float, ptr %68, i64 %74
  %76 = load float, ptr %75, align 4, !tbaa !9
  %77 = load float, ptr %11, align 4, !tbaa !9
  %78 = fsub float %76, %77
  br label %79

79:                                               ; preds = %67, %66
  %80 = phi float [ 0.000000e+00, %66 ], [ %78, %67 ]
  store float %80, ptr %13, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  %81 = load i32, ptr %8, align 4, !tbaa !11
  %82 = icmp eq i32 %81, 0
  br i1 %82, label %86, label %83

83:                                               ; preds = %79
  %84 = load i32, ptr %10, align 4, !tbaa !11
  %85 = icmp eq i32 %84, 1023
  br i1 %85, label %86, label %87

86:                                               ; preds = %83, %79
  br label %100

87:                                               ; preds = %83
  %88 = load ptr, ptr %5, align 8, !tbaa !5
  %89 = load i32, ptr %8, align 4, !tbaa !11
  %90 = sub nsw i32 %89, 1
  %91 = mul nsw i32 %90, 1024
  %92 = load i32, ptr %10, align 4, !tbaa !11
  %93 = add nsw i32 %92, 1
  %94 = add nsw i32 %91, %93
  %95 = sext i32 %94 to i64
  %96 = getelementptr inbounds float, ptr %88, i64 %95
  %97 = load float, ptr %96, align 4, !tbaa !9
  %98 = load float, ptr %11, align 4, !tbaa !9
  %99 = fsub float %97, %98
  br label %100

100:                                              ; preds = %87, %86
  %101 = phi float [ 0.000000e+00, %86 ], [ %99, %87 ]
  store float %101, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #5
  %102 = load i32, ptr %10, align 4, !tbaa !11
  %103 = icmp eq i32 %102, 0
  br i1 %103, label %104, label %105

104:                                              ; preds = %100
  br label %117

105:                                              ; preds = %100
  %106 = load ptr, ptr %5, align 8, !tbaa !5
  %107 = load i32, ptr %8, align 4, !tbaa !11
  %108 = mul nsw i32 %107, 1024
  %109 = load i32, ptr %10, align 4, !tbaa !11
  %110 = sub nsw i32 %109, 1
  %111 = add nsw i32 %108, %110
  %112 = sext i32 %111 to i64
  %113 = getelementptr inbounds float, ptr %106, i64 %112
  %114 = load float, ptr %113, align 4, !tbaa !9
  %115 = load float, ptr %11, align 4, !tbaa !9
  %116 = fsub float %114, %115
  br label %117

117:                                              ; preds = %105, %104
  %118 = phi float [ 0.000000e+00, %104 ], [ %116, %105 ]
  store float %118, ptr %15, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #5
  %119 = load i32, ptr %10, align 4, !tbaa !11
  %120 = icmp eq i32 %119, 1023
  br i1 %120, label %121, label %122

121:                                              ; preds = %117
  br label %134

122:                                              ; preds = %117
  %123 = load ptr, ptr %5, align 8, !tbaa !5
  %124 = load i32, ptr %8, align 4, !tbaa !11
  %125 = mul nsw i32 %124, 1024
  %126 = load i32, ptr %10, align 4, !tbaa !11
  %127 = add nsw i32 %126, 1
  %128 = add nsw i32 %125, %127
  %129 = sext i32 %128 to i64
  %130 = getelementptr inbounds float, ptr %123, i64 %129
  %131 = load float, ptr %130, align 4, !tbaa !9
  %132 = load float, ptr %11, align 4, !tbaa !9
  %133 = fsub float %131, %132
  br label %134

134:                                              ; preds = %122, %121
  %135 = phi float [ 0.000000e+00, %121 ], [ %133, %122 ]
  store float %135, ptr %16, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #5
  %136 = load i32, ptr %8, align 4, !tbaa !11
  %137 = icmp eq i32 %136, 1023
  br i1 %137, label %141, label %138

138:                                              ; preds = %134
  %139 = load i32, ptr %10, align 4, !tbaa !11
  %140 = icmp eq i32 %139, 0
  br i1 %140, label %141, label %142

141:                                              ; preds = %138, %134
  br label %155

142:                                              ; preds = %138
  %143 = load ptr, ptr %5, align 8, !tbaa !5
  %144 = load i32, ptr %8, align 4, !tbaa !11
  %145 = add nsw i32 %144, 1
  %146 = mul nsw i32 %145, 1024
  %147 = load i32, ptr %10, align 4, !tbaa !11
  %148 = sub nsw i32 %147, 1
  %149 = add nsw i32 %146, %148
  %150 = sext i32 %149 to i64
  %151 = getelementptr inbounds float, ptr %143, i64 %150
  %152 = load float, ptr %151, align 4, !tbaa !9
  %153 = load float, ptr %11, align 4, !tbaa !9
  %154 = fsub float %152, %153
  br label %155

155:                                              ; preds = %142, %141
  %156 = phi float [ 0.000000e+00, %141 ], [ %154, %142 ]
  store float %156, ptr %17, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #5
  %157 = load i32, ptr %8, align 4, !tbaa !11
  %158 = icmp eq i32 %157, 1023
  br i1 %158, label %159, label %160

159:                                              ; preds = %155
  br label %172

160:                                              ; preds = %155
  %161 = load ptr, ptr %5, align 8, !tbaa !5
  %162 = load i32, ptr %8, align 4, !tbaa !11
  %163 = add nsw i32 %162, 1
  %164 = mul nsw i32 %163, 1024
  %165 = load i32, ptr %10, align 4, !tbaa !11
  %166 = add nsw i32 %164, %165
  %167 = sext i32 %166 to i64
  %168 = getelementptr inbounds float, ptr %161, i64 %167
  %169 = load float, ptr %168, align 4, !tbaa !9
  %170 = load float, ptr %11, align 4, !tbaa !9
  %171 = fsub float %169, %170
  br label %172

172:                                              ; preds = %160, %159
  %173 = phi float [ 0.000000e+00, %159 ], [ %171, %160 ]
  store float %173, ptr %18, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #5
  %174 = load i32, ptr %8, align 4, !tbaa !11
  %175 = icmp eq i32 %174, 1023
  br i1 %175, label %179, label %176

176:                                              ; preds = %172
  %177 = load i32, ptr %10, align 4, !tbaa !11
  %178 = icmp eq i32 %177, 1023
  br i1 %178, label %179, label %180

179:                                              ; preds = %176, %172
  br label %193

180:                                              ; preds = %176
  %181 = load ptr, ptr %5, align 8, !tbaa !5
  %182 = load i32, ptr %8, align 4, !tbaa !11
  %183 = add nsw i32 %182, 1
  %184 = mul nsw i32 %183, 1024
  %185 = load i32, ptr %10, align 4, !tbaa !11
  %186 = add nsw i32 %185, 1
  %187 = add nsw i32 %184, %186
  %188 = sext i32 %187 to i64
  %189 = getelementptr inbounds float, ptr %181, i64 %188
  %190 = load float, ptr %189, align 4, !tbaa !9
  %191 = load float, ptr %11, align 4, !tbaa !9
  %192 = fsub float %190, %191
  br label %193

193:                                              ; preds = %180, %179
  %194 = phi float [ 0.000000e+00, %179 ], [ %192, %180 ]
  store float %194, ptr %19, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #5
  %195 = load float, ptr %11, align 4, !tbaa !9
  %196 = fpext float %195 to double
  %197 = load float, ptr %12, align 4, !tbaa !9
  %198 = call float @heaviside(float noundef %197)
  %199 = load float, ptr %12, align 4, !tbaa !9
  %200 = load float, ptr %13, align 4, !tbaa !9
  %201 = call float @heaviside(float noundef %200)
  %202 = load float, ptr %13, align 4, !tbaa !9
  %203 = fmul float %201, %202
  %204 = call float @llvm.fmuladd.f32(float %198, float %199, float %203)
  %205 = load float, ptr %14, align 4, !tbaa !9
  %206 = call float @heaviside(float noundef %205)
  %207 = load float, ptr %14, align 4, !tbaa !9
  %208 = call float @llvm.fmuladd.f32(float %206, float %207, float %204)
  %209 = load float, ptr %15, align 4, !tbaa !9
  %210 = call float @heaviside(float noundef %209)
  %211 = load float, ptr %15, align 4, !tbaa !9
  %212 = call float @llvm.fmuladd.f32(float %210, float %211, float %208)
  %213 = load float, ptr %16, align 4, !tbaa !9
  %214 = call float @heaviside(float noundef %213)
  %215 = load float, ptr %16, align 4, !tbaa !9
  %216 = call float @llvm.fmuladd.f32(float %214, float %215, float %212)
  %217 = load float, ptr %17, align 4, !tbaa !9
  %218 = call float @heaviside(float noundef %217)
  %219 = load float, ptr %17, align 4, !tbaa !9
  %220 = call float @llvm.fmuladd.f32(float %218, float %219, float %216)
  %221 = load float, ptr %18, align 4, !tbaa !9
  %222 = call float @heaviside(float noundef %221)
  %223 = load float, ptr %18, align 4, !tbaa !9
  %224 = call float @llvm.fmuladd.f32(float %222, float %223, float %220)
  %225 = load float, ptr %19, align 4, !tbaa !9
  %226 = call float @heaviside(float noundef %225)
  %227 = load float, ptr %19, align 4, !tbaa !9
  %228 = call float @llvm.fmuladd.f32(float %226, float %227, float %224)
  %229 = fpext float %228 to double
  %230 = call double @llvm.fmuladd.f64(double 1.000000e-01, double %229, double %196)
  %231 = fptrunc double %230 to float
  store float %231, ptr %20, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #5
  %232 = load ptr, ptr %6, align 8, !tbaa !5
  %233 = load i32, ptr %8, align 4, !tbaa !11
  %234 = mul nsw i32 %233, 1024
  %235 = load i32, ptr %10, align 4, !tbaa !11
  %236 = add nsw i32 %234, %235
  %237 = sext i32 %236 to i64
  %238 = getelementptr inbounds float, ptr %232, i64 %237
  %239 = load float, ptr %238, align 4, !tbaa !9
  store float %239, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #5
  %240 = load float, ptr %20, align 4, !tbaa !9
  %241 = fpext float %240 to double
  %242 = load float, ptr %21, align 4, !tbaa !9
  %243 = fpext float %242 to double
  %244 = fmul double 2.000000e-01, %243
  %245 = load float, ptr %20, align 4, !tbaa !9
  %246 = load float, ptr %21, align 4, !tbaa !9
  %247 = fsub float %245, %246
  %248 = fpext float %247 to double
  %249 = fneg double %244
  %250 = call double @llvm.fmuladd.f64(double %249, double %248, double %241)
  %251 = fptrunc double %250 to float
  store float %251, ptr %22, align 4, !tbaa !9
  %252 = load float, ptr %22, align 4, !tbaa !9
  %253 = load ptr, ptr %4, align 8, !tbaa !5
  %254 = load i32, ptr %8, align 4, !tbaa !11
  %255 = mul nsw i32 %254, 1024
  %256 = load i32, ptr %10, align 4, !tbaa !11
  %257 = add nsw i32 %255, %256
  %258 = sext i32 %257 to i64
  %259 = getelementptr inbounds float, ptr %253, i64 %258
  store float %252, ptr %259, align 4, !tbaa !9
  %260 = load float, ptr %22, align 4, !tbaa !9
  %261 = load float, ptr %11, align 4, !tbaa !9
  %262 = fsub float %260, %261
  %263 = call noundef float @_ZSt4fabsf(float noundef %262)
  %264 = load float, ptr %7, align 4, !tbaa !9
  %265 = fadd float %264, %263
  store float %265, ptr %7, align 4, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  br label %266

266:                                              ; preds = %193
  %267 = load i32, ptr %10, align 4, !tbaa !11
  %268 = add nsw i32 %267, 1
  store i32 %268, ptr %10, align 4, !tbaa !11
  br label %30, !llvm.loop !13

269:                                              ; preds = %33
  br label %270

270:                                              ; preds = %269
  %271 = load i32, ptr %8, align 4, !tbaa !11
  %272 = add nsw i32 %271, 1
  store i32 %272, ptr %8, align 4, !tbaa !11
  br label %24, !llvm.loop !15

273:                                              ; preds = %27
  %274 = load float, ptr %7, align 4, !tbaa !9
  %275 = fdiv float %274, 0x4130000000000000
  store i32 1, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  ret float %275
}

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_ZSt4fabsf(float noundef) #4

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

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

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


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

; Function Attrs: mustprogress nounwind uwtable
declare dso_local float @heaviside(float noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind uwtable
define dso_local float @lc_mgvf(ptr nocapture noundef writeonly %0, ptr nocapture noundef readonly %1, ptr nocapture noundef readonly %2) local_unnamed_addr #0 {
  %invariant.gep118 = getelementptr i8, ptr %1, i64 -4
  %invariant.gep120 = getelementptr i8, ptr %1, i64 -4
  %invariant.gep122 = getelementptr i8, ptr %1, i64 -4
  %invariant.gep = getelementptr i8, ptr %1, i64 -4096
  %invariant.gep124 = getelementptr inbounds i8, ptr %1, i64 4096
  br label %4

4:                                                ; preds = %.loopexit, %3
  %indvars.iv102 = phi i64 [ 0, %3 ], [ %indvars.iv.next103, %.loopexit ]
  %.099 = phi float [ 0.000000e+00, %3 ], [ %167, %.loopexit ]
  %5 = shl nuw nsw i64 %indvars.iv102, 10
  %6 = icmp eq i64 %indvars.iv102, 0
  %7 = icmp eq i64 %indvars.iv102, 1023
  %8 = or disjoint i64 %5, 1
  %9 = getelementptr inbounds float, ptr %1, i64 %5
  %10 = load float, ptr %9, align 4, !tbaa !5
  br i1 %6, label %.thread109, label %14

.thread109:                                       ; preds = %4
  %11 = getelementptr inbounds float, ptr %1, i64 %8
  %12 = load float, ptr %11, align 4, !tbaa !5
  %13 = fsub float %12, %10
  br label %22

14:                                               ; preds = %4
  %gep = getelementptr float, ptr %invariant.gep, i64 %5
  %15 = load <2 x float>, ptr %gep, align 4, !tbaa !5
  %16 = insertelement <2 x float> poison, float %10, i64 0
  %17 = shufflevector <2 x float> %16, <2 x float> poison, <2 x i32> zeroinitializer
  %18 = fsub <2 x float> %15, %17
  %19 = getelementptr inbounds float, ptr %1, i64 %8
  %20 = load float, ptr %19, align 4, !tbaa !5
  %21 = fsub float %20, %10
  br i1 %7, label %.peel.next, label %22

22:                                               ; preds = %14, %.thread109
  %23 = phi float [ %13, %.thread109 ], [ %21, %14 ]
  %24 = phi <2 x float> [ zeroinitializer, %.thread109 ], [ %18, %14 ]
  %gep125 = getelementptr inbounds float, ptr %invariant.gep124, i64 %5
  %25 = load float, ptr %gep125, align 4, !tbaa !5
  %26 = fsub float %25, %10
  %27 = getelementptr inbounds i8, ptr %9, i64 4100
  %28 = load float, ptr %27, align 4, !tbaa !5
  %29 = fsub float %28, %10
  br label %.peel.next

.peel.next:                                       ; preds = %14, %22
  %30 = phi float [ %23, %22 ], [ %21, %14 ]
  %31 = phi float [ %26, %22 ], [ 0.000000e+00, %14 ]
  %32 = phi float [ %29, %22 ], [ 0.000000e+00, %14 ]
  %33 = phi <2 x float> [ %24, %22 ], [ %18, %14 ]
  %34 = fpext float %10 to double
  %35 = tail call float @heaviside(float noundef 0.000000e+00)
  %36 = extractelement <2 x float> %33, i64 0
  %37 = tail call float @heaviside(float noundef %36)
  %38 = fmul float %36, %37
  %39 = tail call float @llvm.fmuladd.f32(float %35, float 0.000000e+00, float %38)
  %40 = extractelement <2 x float> %33, i64 1
  %41 = tail call float @heaviside(float noundef %40)
  %42 = tail call float @llvm.fmuladd.f32(float %41, float %40, float %39)
  %43 = tail call float @heaviside(float noundef 0.000000e+00)
  %44 = tail call float @llvm.fmuladd.f32(float %43, float 0.000000e+00, float %42)
  %45 = tail call float @heaviside(float noundef %30)
  %46 = tail call float @llvm.fmuladd.f32(float %45, float %30, float %44)
  %47 = tail call float @heaviside(float noundef 0.000000e+00)
  %48 = tail call float @llvm.fmuladd.f32(float %47, float 0.000000e+00, float %46)
  %49 = tail call float @heaviside(float noundef %31)
  %50 = tail call float @llvm.fmuladd.f32(float %49, float %31, float %48)
  %51 = tail call float @heaviside(float noundef %32)
  %52 = tail call float @llvm.fmuladd.f32(float %51, float %32, float %50)
  %53 = fpext float %52 to double
  %54 = tail call double @llvm.fmuladd.f64(double %53, double 1.000000e-01, double %34)
  %55 = fptrunc double %54 to float
  %56 = getelementptr inbounds float, ptr %2, i64 %5
  %57 = load float, ptr %56, align 4, !tbaa !5
  %58 = fpext float %55 to double
  %59 = fpext float %57 to double
  %60 = fsub float %55, %57
  %61 = fpext float %60 to double
  %62 = fmul double %59, -2.000000e-01
  %63 = tail call double @llvm.fmuladd.f64(double %62, double %61, double %58)
  %64 = fptrunc double %63 to float
  %65 = getelementptr inbounds float, ptr %0, i64 %5
  store float %64, ptr %65, align 4, !tbaa !5
  %66 = fsub float %64, %10
  %67 = tail call noundef float @_ZSt4fabsf(float noundef %66)
  %68 = fadd float %.099, %67
  %gep119 = getelementptr float, ptr %invariant.gep118, i64 %5
  %gep121 = getelementptr float, ptr %invariant.gep120, i64 %5
  %gep123 = getelementptr float, ptr %invariant.gep122, i64 %5
  %69 = getelementptr inbounds float, ptr %1, i64 %8
  br label %72

70:                                               ; preds = %.loopexit
  %71 = fmul float %167, 0x3EB0000000000000
  ret float %71

.loopexit:                                        ; preds = %.thread94
  %indvars.iv.next103 = add nuw nsw i64 %indvars.iv102, 1
  %exitcond105.not = icmp eq i64 %indvars.iv.next103, 1024
  br i1 %exitcond105.not, label %70, label %4, !llvm.loop !9

72:                                               ; preds = %.peel.next, %.thread94
  %indvars.iv = phi i64 [ 1, %.peel.next ], [ %indvars.iv.next, %.thread94 ]
  %.197 = phi float [ %68, %.peel.next ], [ %167, %.thread94 ]
  %73 = or disjoint i64 %indvars.iv, %5
  %74 = getelementptr inbounds float, ptr %1, i64 %73
  %75 = load float, ptr %74, align 4, !tbaa !5
  br i1 %6, label %.thread91, label %85

.thread91:                                        ; preds = %72
  %76 = icmp eq i64 %indvars.iv, 1023
  %77 = getelementptr float, ptr %gep123, i64 %indvars.iv
  %78 = load float, ptr %77, align 4, !tbaa !5
  %79 = fsub float %78, %75
  br i1 %76, label %.thread112, label %102

.thread112:                                       ; preds = %.thread91
  %80 = getelementptr inbounds i8, ptr %74, i64 4092
  %81 = load <2 x float>, ptr %80, align 4, !tbaa !5
  %82 = insertelement <2 x float> poison, float %75, i64 0
  %83 = shufflevector <2 x float> %82, <2 x float> poison, <2 x i32> zeroinitializer
  %84 = fsub <2 x float> %81, %83
  br label %.thread94

85:                                               ; preds = %72
  %86 = getelementptr i8, ptr %74, i64 -4100
  %87 = load <2 x float>, ptr %86, align 4, !tbaa !5
  %88 = insertelement <2 x float> poison, float %75, i64 0
  %89 = shufflevector <2 x float> %88, <2 x float> poison, <2 x i32> zeroinitializer
  %90 = fsub <2 x float> %87, %89
  %91 = icmp eq i64 %indvars.iv, 1023
  %or.cond3 = or i1 %6, %91
  br i1 %or.cond3, label %98, label %.thread110

.thread110:                                       ; preds = %85
  %92 = getelementptr i8, ptr %74, i64 -4092
  %93 = load float, ptr %92, align 4, !tbaa !5
  %94 = fsub float %93, %75
  %95 = getelementptr float, ptr %gep119, i64 %indvars.iv
  %96 = load float, ptr %95, align 4, !tbaa !5
  %97 = fsub float %96, %75
  br label %102

98:                                               ; preds = %85
  %99 = getelementptr float, ptr %gep121, i64 %indvars.iv
  %100 = load float, ptr %99, align 4, !tbaa !5
  %101 = fsub float %100, %75
  br i1 %91, label %109, label %102

102:                                              ; preds = %.thread91, %.thread110, %98
  %103 = phi float [ %97, %.thread110 ], [ %101, %98 ], [ %79, %.thread91 ]
  %104 = phi float [ %94, %.thread110 ], [ 0.000000e+00, %98 ], [ 0.000000e+00, %.thread91 ]
  %105 = phi <2 x float> [ %90, %.thread110 ], [ %90, %98 ], [ zeroinitializer, %.thread91 ]
  %106 = getelementptr inbounds float, ptr %69, i64 %indvars.iv
  %107 = load float, ptr %106, align 4, !tbaa !5
  %108 = fsub float %107, %75
  br label %109

109:                                              ; preds = %98, %102
  %110 = phi float [ %103, %102 ], [ %101, %98 ]
  %111 = phi float [ %104, %102 ], [ 0.000000e+00, %98 ]
  %112 = phi i1 [ false, %102 ], [ true, %98 ]
  %113 = phi float [ %108, %102 ], [ 0.000000e+00, %98 ]
  %114 = phi <2 x float> [ %105, %102 ], [ %90, %98 ]
  br i1 %7, label %.thread94, label %115

115:                                              ; preds = %109
  %116 = getelementptr inbounds i8, ptr %74, i64 4092
  %117 = load <2 x float>, ptr %116, align 4, !tbaa !5
  %118 = insertelement <2 x float> poison, float %75, i64 0
  %119 = shufflevector <2 x float> %118, <2 x float> poison, <2 x i32> zeroinitializer
  %120 = fsub <2 x float> %117, %119
  %or.cond7 = or i1 %7, %112
  br i1 %or.cond7, label %.thread94, label %121

121:                                              ; preds = %115
  %122 = getelementptr inbounds i8, ptr %74, i64 4100
  %123 = load float, ptr %122, align 4, !tbaa !5
  %124 = fsub float %123, %75
  br label %.thread94

.thread94:                                        ; preds = %.thread112, %109, %115, %121
  %125 = phi float [ %113, %121 ], [ %113, %115 ], [ %113, %109 ], [ 0.000000e+00, %.thread112 ]
  %126 = phi float [ %111, %121 ], [ %111, %115 ], [ %111, %109 ], [ 0.000000e+00, %.thread112 ]
  %127 = phi float [ %110, %121 ], [ %110, %115 ], [ %110, %109 ], [ %79, %.thread112 ]
  %128 = phi float [ %124, %121 ], [ 0.000000e+00, %115 ], [ 0.000000e+00, %109 ], [ 0.000000e+00, %.thread112 ]
  %129 = phi <2 x float> [ %120, %121 ], [ %120, %115 ], [ zeroinitializer, %109 ], [ %84, %.thread112 ]
  %130 = phi <2 x float> [ %114, %121 ], [ %114, %115 ], [ %114, %109 ], [ zeroinitializer, %.thread112 ]
  %131 = fpext float %75 to double
  %132 = extractelement <2 x float> %130, i64 0
  %133 = tail call float @heaviside(float noundef %132)
  %134 = extractelement <2 x float> %130, i64 1
  %135 = tail call float @heaviside(float noundef %134)
  %136 = fmul float %134, %135
  %137 = tail call float @llvm.fmuladd.f32(float %133, float %132, float %136)
  %138 = tail call float @heaviside(float noundef %126)
  %139 = tail call float @llvm.fmuladd.f32(float %138, float %126, float %137)
  %140 = tail call float @heaviside(float noundef %127)
  %141 = tail call float @llvm.fmuladd.f32(float %140, float %127, float %139)
  %142 = tail call float @heaviside(float noundef %125)
  %143 = tail call float @llvm.fmuladd.f32(float %142, float %125, float %141)
  %144 = extractelement <2 x float> %129, i64 0
  %145 = tail call float @heaviside(float noundef %144)
  %146 = tail call float @llvm.fmuladd.f32(float %145, float %144, float %143)
  %147 = extractelement <2 x float> %129, i64 1
  %148 = tail call float @heaviside(float noundef %147)
  %149 = tail call float @llvm.fmuladd.f32(float %148, float %147, float %146)
  %150 = tail call float @heaviside(float noundef %128)
  %151 = tail call float @llvm.fmuladd.f32(float %150, float %128, float %149)
  %152 = fpext float %151 to double
  %153 = tail call double @llvm.fmuladd.f64(double %152, double 1.000000e-01, double %131)
  %154 = fptrunc double %153 to float
  %155 = getelementptr inbounds float, ptr %2, i64 %73
  %156 = load float, ptr %155, align 4, !tbaa !5
  %157 = fpext float %154 to double
  %158 = fpext float %156 to double
  %159 = fsub float %154, %156
  %160 = fpext float %159 to double
  %161 = fmul double %158, -2.000000e-01
  %162 = tail call double @llvm.fmuladd.f64(double %161, double %160, double %157)
  %163 = fptrunc double %162 to float
  %164 = getelementptr inbounds float, ptr %0, i64 %73
  store float %163, ptr %164, align 4, !tbaa !5
  %165 = fsub float %163, %75
  %166 = tail call noundef float @_ZSt4fabsf(float noundef %165)
  %167 = fadd float %.197, %166
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, 1024
  br i1 %exitcond.not, label %.loopexit, label %72, !llvm.loop !11
}

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

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_ZSt4fabsf(float noundef) local_unnamed_addr #2

attributes #0 = { mustprogress 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 = { inlinehint mustprogress 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" }

!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 = !{!"float", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = distinct !{!9, !10}
!10 = !{!"llvm.loop.mustprogress"}
!11 = distinct !{!11, !10, !12}
!12 = !{!"llvm.loop.peeled.count", i32 1}


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