; LLVM IR from Dynmi/AlexNet :: src (batchnorm_layer)

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

; 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,1)
declare noalias ptr @calloc(i64 noundef, i64 noundef) #1

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

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

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

; Function Attrs: nounwind
declare void @free(ptr noundef) #3

; Function Attrs: nounwind uwtable
define dso_local void @batch_norm_op_backward(ptr noundef %0) #4 {
  %2 = alloca ptr, align 8
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %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
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #5
  %15 = load ptr, ptr %2, align 8, !tbaa !5
  %16 = getelementptr inbounds %struct.batch_norm_op, ptr %15, i32 0, i32 8
  %17 = load i32, ptr %16, align 8, !tbaa !9
  store i32 %17, ptr %3, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #5
  %18 = load i32, ptr %3, align 4, !tbaa !13
  %19 = sext i32 %18 to i64
  %20 = call noalias ptr @calloc(i64 noundef %19, i64 noundef 4) #6
  store ptr %20, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #5
  store i32 0, ptr %5, align 4, !tbaa !13
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #5
  store i32 0, ptr %6, align 4, !tbaa !13
  br label %21

21:                                               ; preds = %63, %1
  %22 = load i32, ptr %6, align 4, !tbaa !13
  %23 = load ptr, ptr %2, align 8, !tbaa !5
  %24 = getelementptr inbounds %struct.batch_norm_op, ptr %23, i32 0, i32 9
  %25 = load i16, ptr %24, align 4, !tbaa !14
  %26 = sext i16 %25 to i32
  %27 = icmp slt i32 %22, %26
  br i1 %27, label %29, label %28

28:                                               ; preds = %21
  store i32 2, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #5
  br label %66

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

30:                                               ; preds = %59, %29
  %31 = load i32, ptr %8, align 4, !tbaa !13
  %32 = load i32, ptr %3, align 4, !tbaa !13
  %33 = icmp slt i32 %31, %32
  br i1 %33, label %35, label %34

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

35:                                               ; preds = %30
  %36 = load ptr, ptr %2, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.batch_norm_op, ptr %36, i32 0, i32 10
  %38 = load ptr, ptr %37, align 8, !tbaa !15
  %39 = load i32, ptr %5, align 4, !tbaa !13
  %40 = add nsw i32 %39, 1
  store i32 %40, ptr %5, align 4, !tbaa !13
  %41 = sext i32 %39 to i64
  %42 = getelementptr inbounds float, ptr %38, i64 %41
  %43 = load float, ptr %42, align 4, !tbaa !16
  %44 = load ptr, ptr %2, align 8, !tbaa !5
  %45 = getelementptr inbounds %struct.batch_norm_op, ptr %44, i32 0, i32 3
  %46 = load ptr, ptr %45, align 8, !tbaa !18
  %47 = load i32, ptr %8, align 4, !tbaa !13
  %48 = sext i32 %47 to i64
  %49 = getelementptr inbounds float, ptr %46, i64 %48
  %50 = load float, ptr %49, align 4, !tbaa !16
  %51 = load ptr, ptr %2, align 8, !tbaa !5
  %52 = getelementptr inbounds %struct.batch_norm_op, ptr %51, i32 0, i32 5
  %53 = load ptr, ptr %52, align 8, !tbaa !19
  %54 = load i32, ptr %8, align 4, !tbaa !13
  %55 = sext i32 %54 to i64
  %56 = getelementptr inbounds float, ptr %53, i64 %55
  %57 = load float, ptr %56, align 4, !tbaa !16
  %58 = call float @llvm.fmuladd.f32(float %43, float %50, float %57)
  store float %58, ptr %56, align 4, !tbaa !16
  br label %59

59:                                               ; preds = %35
  %60 = load i32, ptr %8, align 4, !tbaa !13
  %61 = add nsw i32 %60, 1
  store i32 %61, ptr %8, align 4, !tbaa !13
  br label %30, !llvm.loop !20

62:                                               ; preds = %34
  br label %63

63:                                               ; preds = %62
  %64 = load i32, ptr %6, align 4, !tbaa !13
  %65 = add nsw i32 %64, 1
  store i32 %65, ptr %6, align 4, !tbaa !13
  br label %21, !llvm.loop !22

66:                                               ; preds = %28
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  store i32 0, ptr %9, align 4, !tbaa !13
  br label %67

67:                                               ; preds = %86, %66
  %68 = load i32, ptr %9, align 4, !tbaa !13
  %69 = load i32, ptr %3, align 4, !tbaa !13
  %70 = icmp slt i32 %68, %69
  br i1 %70, label %72, label %71

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

72:                                               ; preds = %67
  %73 = load ptr, ptr %2, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.batch_norm_op, ptr %73, i32 0, i32 9
  %75 = load i16, ptr %74, align 4, !tbaa !14
  %76 = sext i16 %75 to i32
  %77 = sitofp i32 %76 to float
  %78 = load ptr, ptr %2, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.batch_norm_op, ptr %78, i32 0, i32 5
  %80 = load ptr, ptr %79, align 8, !tbaa !19
  %81 = load i32, ptr %9, align 4, !tbaa !13
  %82 = sext i32 %81 to i64
  %83 = getelementptr inbounds float, ptr %80, i64 %82
  %84 = load float, ptr %83, align 4, !tbaa !16
  %85 = fdiv float %84, %77
  store float %85, ptr %83, align 4, !tbaa !16
  br label %86

86:                                               ; preds = %72
  %87 = load i32, ptr %9, align 4, !tbaa !13
  %88 = add nsw i32 %87, 1
  store i32 %88, ptr %9, align 4, !tbaa !13
  br label %67, !llvm.loop !23

89:                                               ; preds = %71
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #5
  store i32 0, ptr %10, align 4, !tbaa !13
  br label %90

90:                                               ; preds = %111, %89
  %91 = load i32, ptr %10, align 4, !tbaa !13
  %92 = load i32, ptr %3, align 4, !tbaa !13
  %93 = icmp slt i32 %91, %92
  br i1 %93, label %95, label %94

94:                                               ; preds = %90
  store i32 11, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  br label %114

95:                                               ; preds = %90
  %96 = load ptr, ptr %2, align 8, !tbaa !5
  %97 = getelementptr inbounds %struct.batch_norm_op, ptr %96, i32 0, i32 3
  %98 = load ptr, ptr %97, align 8, !tbaa !18
  %99 = load i32, ptr %10, align 4, !tbaa !13
  %100 = sext i32 %99 to i64
  %101 = getelementptr inbounds float, ptr %98, i64 %100
  %102 = load float, ptr %101, align 4, !tbaa !16
  %103 = load ptr, ptr %2, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.batch_norm_op, ptr %103, i32 0, i32 7
  %105 = load ptr, ptr %104, align 8, !tbaa !24
  %106 = load i32, ptr %10, align 4, !tbaa !13
  %107 = sext i32 %106 to i64
  %108 = getelementptr inbounds float, ptr %105, i64 %107
  %109 = load float, ptr %108, align 4, !tbaa !16
  %110 = fadd float %109, %102
  store float %110, ptr %108, align 4, !tbaa !16
  br label %111

111:                                              ; preds = %95
  %112 = load i32, ptr %10, align 4, !tbaa !13
  %113 = add nsw i32 %112, 1
  store i32 %113, ptr %10, align 4, !tbaa !13
  br label %90, !llvm.loop !25

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

115:                                              ; preds = %148, %114
  %116 = load i32, ptr %11, align 4, !tbaa !13
  %117 = load ptr, ptr %2, align 8, !tbaa !5
  %118 = getelementptr inbounds %struct.batch_norm_op, ptr %117, i32 0, i32 9
  %119 = load i16, ptr %118, align 4, !tbaa !14
  %120 = sext i16 %119 to i32
  %121 = icmp slt i32 %116, %120
  br i1 %121, label %123, label %122

122:                                              ; preds = %115
  store i32 14, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  br label %151

123:                                              ; preds = %115
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #5
  store i32 0, ptr %12, align 4, !tbaa !13
  br label %124

124:                                              ; preds = %144, %123
  %125 = load i32, ptr %12, align 4, !tbaa !13
  %126 = load i32, ptr %3, align 4, !tbaa !13
  %127 = icmp slt i32 %125, %126
  br i1 %127, label %129, label %128

128:                                              ; preds = %124
  store i32 17, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #5
  br label %147

129:                                              ; preds = %124
  %130 = load ptr, ptr %2, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.batch_norm_op, ptr %130, i32 0, i32 10
  %132 = load ptr, ptr %131, align 8, !tbaa !15
  %133 = load i32, ptr %5, align 4, !tbaa !13
  %134 = add nsw i32 %133, 1
  store i32 %134, ptr %5, align 4, !tbaa !13
  %135 = sext i32 %133 to i64
  %136 = getelementptr inbounds float, ptr %132, i64 %135
  %137 = load float, ptr %136, align 4, !tbaa !16
  %138 = load ptr, ptr %4, align 8, !tbaa !5
  %139 = load i32, ptr %12, align 4, !tbaa !13
  %140 = sext i32 %139 to i64
  %141 = getelementptr inbounds float, ptr %138, i64 %140
  %142 = load float, ptr %141, align 4, !tbaa !16
  %143 = fadd float %142, %137
  store float %143, ptr %141, align 4, !tbaa !16
  br label %144

144:                                              ; preds = %129
  %145 = load i32, ptr %12, align 4, !tbaa !13
  %146 = add nsw i32 %145, 1
  store i32 %146, ptr %12, align 4, !tbaa !13
  br label %124, !llvm.loop !26

147:                                              ; preds = %128
  br label %148

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

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

152:                                              ; preds = %169, %151
  %153 = load i32, ptr %13, align 4, !tbaa !13
  %154 = load i32, ptr %3, align 4, !tbaa !13
  %155 = icmp slt i32 %153, %154
  br i1 %155, label %157, label %156

156:                                              ; preds = %152
  store i32 20, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  br label %172

157:                                              ; preds = %152
  %158 = load ptr, ptr %2, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.batch_norm_op, ptr %158, i32 0, i32 9
  %160 = load i16, ptr %159, align 4, !tbaa !14
  %161 = sext i16 %160 to i32
  %162 = sitofp i32 %161 to float
  %163 = load ptr, ptr %4, align 8, !tbaa !5
  %164 = load i32, ptr %13, align 4, !tbaa !13
  %165 = sext i32 %164 to i64
  %166 = getelementptr inbounds float, ptr %163, i64 %165
  %167 = load float, ptr %166, align 4, !tbaa !16
  %168 = fdiv float %167, %162
  store float %168, ptr %166, align 4, !tbaa !16
  br label %169

169:                                              ; preds = %157
  %170 = load i32, ptr %13, align 4, !tbaa !13
  %171 = add nsw i32 %170, 1
  store i32 %171, ptr %13, align 4, !tbaa !13
  br label %152, !llvm.loop !28

172:                                              ; preds = %156
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  store i32 0, ptr %14, align 4, !tbaa !13
  br label %173

173:                                              ; preds = %220, %172
  %174 = load i32, ptr %14, align 4, !tbaa !13
  %175 = load i32, ptr %3, align 4, !tbaa !13
  %176 = icmp slt i32 %174, %175
  br i1 %176, label %178, label %177

177:                                              ; preds = %173
  store i32 23, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  br label %223

178:                                              ; preds = %173
  %179 = load ptr, ptr %2, align 8, !tbaa !5
  %180 = getelementptr inbounds %struct.batch_norm_op, ptr %179, i32 0, i32 4
  %181 = load ptr, ptr %180, align 8, !tbaa !29
  %182 = load i32, ptr %14, align 4, !tbaa !13
  %183 = sext i32 %182 to i64
  %184 = getelementptr inbounds float, ptr %181, i64 %183
  %185 = load float, ptr %184, align 4, !tbaa !16
  %186 = load ptr, ptr %2, align 8, !tbaa !5
  %187 = getelementptr inbounds %struct.batch_norm_op, ptr %186, i32 0, i32 3
  %188 = load ptr, ptr %187, align 8, !tbaa !18
  %189 = load i32, ptr %14, align 4, !tbaa !13
  %190 = sext i32 %189 to i64
  %191 = getelementptr inbounds float, ptr %188, i64 %190
  %192 = load float, ptr %191, align 4, !tbaa !16
  %193 = fmul float %185, %192
  %194 = load ptr, ptr %4, align 8, !tbaa !5
  %195 = load i32, ptr %14, align 4, !tbaa !13
  %196 = sext i32 %195 to i64
  %197 = getelementptr inbounds float, ptr %194, i64 %196
  %198 = load float, ptr %197, align 4, !tbaa !16
  %199 = fmul float %193, %198
  %200 = fpext float %199 to double
  %201 = load ptr, ptr %2, align 8, !tbaa !5
  %202 = getelementptr inbounds %struct.batch_norm_op, ptr %201, i32 0, i32 12
  %203 = load ptr, ptr %202, align 8, !tbaa !30
  %204 = load i32, ptr %14, align 4, !tbaa !13
  %205 = sext i32 %204 to i64
  %206 = getelementptr inbounds float, ptr %203, i64 %205
  %207 = load float, ptr %206, align 4, !tbaa !16
  %208 = fpext float %207 to double
  %209 = fadd double %208, 1.000000e-05
  %210 = call double @sqrt(double noundef %209) #5
  %211 = fdiv double %200, %210
  %212 = fsub double 0.000000e+00, %211
  %213 = fptrunc double %212 to float
  %214 = load ptr, ptr %2, align 8, !tbaa !5
  %215 = getelementptr inbounds %struct.batch_norm_op, ptr %214, i32 0, i32 1
  %216 = load ptr, ptr %215, align 8, !tbaa !31
  %217 = load i32, ptr %14, align 4, !tbaa !13
  %218 = sext i32 %217 to i64
  %219 = getelementptr inbounds float, ptr %216, i64 %218
  store float %213, ptr %219, align 4, !tbaa !16
  br label %220

220:                                              ; preds = %178
  %221 = load i32, ptr %14, align 4, !tbaa !13
  %222 = add nsw i32 %221, 1
  store i32 %222, ptr %14, align 4, !tbaa !13
  br label %173, !llvm.loop !32

223:                                              ; preds = %177
  %224 = load ptr, ptr %4, align 8, !tbaa !5
  call void @free(ptr noundef %224) #5
  %225 = load ptr, ptr %2, align 8, !tbaa !5
  %226 = getelementptr inbounds %struct.batch_norm_op, ptr %225, i32 0, i32 12
  %227 = load ptr, ptr %226, align 8, !tbaa !30
  call void @free(ptr noundef %227) #5
  %228 = load ptr, ptr %2, align 8, !tbaa !5
  %229 = getelementptr inbounds %struct.batch_norm_op, ptr %228, i32 0, i32 10
  %230 = load ptr, ptr %229, align 8, !tbaa !15
  call void @free(ptr noundef %230) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %4) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #5
  ret void
}

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

!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 64}
!10 = !{!"batch_norm_op", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !11, i64 64, !12, i64 68, !6, i64 72, !6, i64 80, !6, i64 88}
!11 = !{!"int", !7, i64 0}
!12 = !{!"short", !7, i64 0}
!13 = !{!11, !11, i64 0}
!14 = !{!10, !12, i64 68}
!15 = !{!10, !6, i64 72}
!16 = !{!17, !17, i64 0}
!17 = !{!"float", !7, i64 0}
!18 = !{!10, !6, i64 24}
!19 = !{!10, !6, i64 40}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = distinct !{!22, !21}
!23 = distinct !{!23, !21}
!24 = !{!10, !6, i64 56}
!25 = distinct !{!25, !21}
!26 = distinct !{!26, !21}
!27 = distinct !{!27, !21}
!28 = distinct !{!28, !21}
!29 = !{!10, !6, i64 32}
!30 = !{!10, !6, i64 88}
!31 = !{!10, !6, i64 8}
!32 = distinct !{!32, !21}


; 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,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @calloc(i64 noundef, i64 noundef) local_unnamed_addr #0

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

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

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
define dso_local void @batch_norm_op_backward(ptr nocapture noundef readonly %0) local_unnamed_addr #4 {
  %2 = getelementptr inbounds i8, ptr %0, i64 64
  %3 = load i32, ptr %2, align 8, !tbaa !5
  %4 = sext i32 %3 to i64
  %5 = tail call noalias ptr @calloc(i64 noundef %4, i64 noundef 4) #6
  %6 = getelementptr inbounds i8, ptr %0, i64 68
  %7 = load i16, ptr %6, align 4, !tbaa !12
  %8 = sext i16 %7 to i32
  %9 = icmp sgt i16 %7, 0
  br i1 %9, label %.preheader72.lr.ph, label %.preheader71

.preheader72.lr.ph:                               ; preds = %1
  %10 = icmp sgt i32 %3, 0
  br i1 %10, label %.preheader72.lr.ph.split.us, label %._crit_edge

.preheader72.lr.ph.split.us:                      ; preds = %.preheader72.lr.ph
  %11 = getelementptr inbounds i8, ptr %0, i64 40
  %12 = getelementptr inbounds i8, ptr %0, i64 24
  %13 = getelementptr inbounds i8, ptr %0, i64 72
  %14 = load ptr, ptr %13, align 8, !tbaa !13
  %15 = load ptr, ptr %12, align 8, !tbaa !14
  %16 = load ptr, ptr %11, align 8, !tbaa !15
  %wide.trip.count = zext nneg i32 %3 to i64
  %17 = shl nuw nsw i64 %wide.trip.count, 2
  %scevgep = getelementptr i8, ptr %16, i64 %17
  %scevgep136 = getelementptr i8, ptr %14, i64 %17
  %scevgep138 = getelementptr i8, ptr %15, i64 %17
  %min.iters.check = icmp ult i32 %3, 8
  %bound0139 = icmp ult ptr %16, %scevgep138
  %bound1140 = icmp ult ptr %15, %scevgep
  %found.conflict141 = and i1 %bound0139, %bound1140
  %n.vec = and i64 %wide.trip.count, 2147483640
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  %xtraiter = and i64 %wide.trip.count, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  %18 = add nsw i64 %wide.trip.count, -1
  %invariant.gep = getelementptr i8, ptr %14, i64 4
  br label %.preheader72.us

.preheader72.us:                                  ; preds = %._crit_edge.us, %.preheader72.lr.ph.split.us
  %.06477.us = phi i32 [ 0, %.preheader72.lr.ph.split.us ], [ %52, %._crit_edge.us ]
  %.06576.us = phi i64 [ 0, %.preheader72.lr.ph.split.us ], [ %indvars.iv.next99.lcssa, %._crit_edge.us ]
  %sext = shl i64 %.06576.us, 32
  %19 = ashr exact i64 %sext, 32
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.memcheck

vector.memcheck:                                  ; preds = %.preheader72.us
  %20 = ashr exact i64 %sext, 30
  %scevgep135 = getelementptr i8, ptr %14, i64 %20
  %scevgep137 = getelementptr i8, ptr %scevgep136, i64 %20
  %bound0 = icmp ult ptr %16, %scevgep137
  %bound1 = icmp ult ptr %scevgep135, %scevgep
  %found.conflict = and i1 %bound0, %bound1
  %conflict.rdx = or i1 %found.conflict, %found.conflict141
  br i1 %conflict.rdx, label %scalar.ph.preheader, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %ind.end = add nsw i64 %19, %n.vec
  %21 = getelementptr float, ptr %14, i64 %19
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %22 = getelementptr float, ptr %21, i64 %index
  %23 = getelementptr inbounds i8, ptr %22, i64 16
  %wide.load = load <4 x float>, ptr %22, align 4, !tbaa !16, !alias.scope !18
  %wide.load143 = load <4 x float>, ptr %23, align 4, !tbaa !16, !alias.scope !18
  %24 = getelementptr inbounds float, ptr %15, i64 %index
  %25 = getelementptr inbounds i8, ptr %24, i64 16
  %wide.load144 = load <4 x float>, ptr %24, align 4, !tbaa !16, !alias.scope !21
  %wide.load145 = load <4 x float>, ptr %25, align 4, !tbaa !16, !alias.scope !21
  %26 = getelementptr inbounds float, ptr %16, i64 %index
  %27 = getelementptr inbounds i8, ptr %26, i64 16
  %wide.load146 = load <4 x float>, ptr %26, align 4, !tbaa !16, !alias.scope !23, !noalias !25
  %wide.load147 = load <4 x float>, ptr %27, align 4, !tbaa !16, !alias.scope !23, !noalias !25
  %28 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %wide.load, <4 x float> %wide.load144, <4 x float> %wide.load146)
  %29 = tail call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %wide.load143, <4 x float> %wide.load145, <4 x float> %wide.load147)
  store <4 x float> %28, ptr %26, align 4, !tbaa !16, !alias.scope !23, !noalias !25
  store <4 x float> %29, ptr %27, align 4, !tbaa !16, !alias.scope !23, !noalias !25
  %index.next = add nuw i64 %index, 8
  %30 = icmp eq i64 %index.next, %n.vec
  br i1 %30, label %middle.block, label %vector.body, !llvm.loop !26

middle.block:                                     ; preds = %vector.body
  br i1 %cmp.n, label %._crit_edge.us, label %scalar.ph.preheader

scalar.ph.preheader:                              ; preds = %middle.block, %vector.memcheck, %.preheader72.us
  %indvars.iv98.ph = phi i64 [ %19, %vector.memcheck ], [ %19, %.preheader72.us ], [ %ind.end, %middle.block ]
  %indvars.iv.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.preheader72.us ], [ %n.vec, %middle.block ]
  br i1 %lcmp.mod.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader
  %indvars.iv.next99.prol = add nsw i64 %indvars.iv98.ph, 1
  %31 = getelementptr inbounds float, ptr %14, i64 %indvars.iv98.ph
  %32 = load float, ptr %31, align 4, !tbaa !16
  %33 = getelementptr inbounds float, ptr %15, i64 %indvars.iv.ph
  %34 = load float, ptr %33, align 4, !tbaa !16
  %35 = getelementptr inbounds float, ptr %16, i64 %indvars.iv.ph
  %36 = load float, ptr %35, align 4, !tbaa !16
  %37 = tail call float @llvm.fmuladd.f32(float %32, float %34, float %36)
  store float %37, ptr %35, align 4, !tbaa !16
  %indvars.iv.next.prol = or disjoint i64 %indvars.iv.ph, 1
  br label %scalar.ph.prol.loopexit

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %indvars.iv.next99.lcssa214.unr = phi i64 [ poison, %scalar.ph.preheader ], [ %indvars.iv.next99.prol, %scalar.ph.prol ]
  %indvars.iv98.unr = phi i64 [ %indvars.iv98.ph, %scalar.ph.preheader ], [ %indvars.iv.next99.prol, %scalar.ph.prol ]
  %indvars.iv.unr = phi i64 [ %indvars.iv.ph, %scalar.ph.preheader ], [ %indvars.iv.next.prol, %scalar.ph.prol ]
  %38 = icmp eq i64 %indvars.iv.ph, %18
  br i1 %38, label %._crit_edge.us, label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv98 = phi i64 [ %indvars.iv.next99.1, %scalar.ph ], [ %indvars.iv98.unr, %scalar.ph.prol.loopexit ]
  %indvars.iv = phi i64 [ %indvars.iv.next.1, %scalar.ph ], [ %indvars.iv.unr, %scalar.ph.prol.loopexit ]
  %39 = getelementptr inbounds float, ptr %14, i64 %indvars.iv98
  %40 = load float, ptr %39, align 4, !tbaa !16
  %41 = getelementptr inbounds float, ptr %15, i64 %indvars.iv
  %42 = load float, ptr %41, align 4, !tbaa !16
  %43 = getelementptr inbounds float, ptr %16, i64 %indvars.iv
  %44 = load float, ptr %43, align 4, !tbaa !16
  %45 = tail call float @llvm.fmuladd.f32(float %40, float %42, float %44)
  store float %45, ptr %43, align 4, !tbaa !16
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %indvars.iv.next99.1 = add nsw i64 %indvars.iv98, 2
  %gep = getelementptr float, ptr %invariant.gep, i64 %indvars.iv98
  %46 = load float, ptr %gep, align 4, !tbaa !16
  %47 = getelementptr inbounds float, ptr %15, i64 %indvars.iv.next
  %48 = load float, ptr %47, align 4, !tbaa !16
  %49 = getelementptr inbounds float, ptr %16, i64 %indvars.iv.next
  %50 = load float, ptr %49, align 4, !tbaa !16
  %51 = tail call float @llvm.fmuladd.f32(float %46, float %48, float %50)
  store float %51, ptr %49, align 4, !tbaa !16
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %exitcond.not.1 = icmp eq i64 %indvars.iv.next.1, %wide.trip.count
  br i1 %exitcond.not.1, label %._crit_edge.us, label %scalar.ph, !llvm.loop !30

._crit_edge.us:                                   ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block
  %indvars.iv.next99.lcssa = phi i64 [ %ind.end, %middle.block ], [ %indvars.iv.next99.lcssa214.unr, %scalar.ph.prol.loopexit ], [ %indvars.iv.next99.1, %scalar.ph ]
  %52 = add nuw nsw i32 %.06477.us, 1
  %exitcond103.not = icmp eq i32 %52, %8
  br i1 %exitcond103.not, label %.preheader71, label %.preheader72.us, !llvm.loop !31

.preheader71:                                     ; preds = %._crit_edge.us, %1
  %53 = icmp sgt i32 %3, 0
  br i1 %53, label %.lr.ph, label %.preheader69

.lr.ph:                                           ; preds = %.preheader71
  %54 = sitofp i16 %7 to float
  %55 = getelementptr inbounds i8, ptr %0, i64 40
  %56 = load ptr, ptr %55, align 8, !tbaa !15
  %wide.trip.count107 = zext nneg i32 %3 to i64
  %min.iters.check150 = icmp ult i32 %3, 4
  br i1 %min.iters.check150, label %scalar.ph149.preheader, label %vector.ph151

scalar.ph149.preheader:                           ; preds = %middle.block148, %.lr.ph
  %indvars.iv104.ph = phi i64 [ 0, %.lr.ph ], [ %n.vec153, %middle.block148 ]
  br label %scalar.ph149

vector.ph151:                                     ; preds = %.lr.ph
  %n.vec153 = and i64 %wide.trip.count107, 2147483644
  %broadcast.splatinsert = insertelement <4 x float> poison, float %54, i64 0
  %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body155

vector.body155:                                   ; preds = %vector.body155, %vector.ph151
  %index156 = phi i64 [ 0, %vector.ph151 ], [ %index.next158, %vector.body155 ]
  %57 = getelementptr inbounds float, ptr %56, i64 %index156
  %wide.load157 = load <4 x float>, ptr %57, align 4, !tbaa !16
  %58 = fdiv <4 x float> %wide.load157, %broadcast.splat
  store <4 x float> %58, ptr %57, align 4, !tbaa !16
  %index.next158 = add nuw i64 %index156, 4
  %59 = icmp eq i64 %index.next158, %n.vec153
  br i1 %59, label %middle.block148, label %vector.body155, !llvm.loop !32

middle.block148:                                  ; preds = %vector.body155
  %cmp.n159 = icmp eq i64 %n.vec153, %wide.trip.count107
  br i1 %cmp.n159, label %.preheader70, label %scalar.ph149.preheader

.preheader70:                                     ; preds = %scalar.ph149, %middle.block148
  br i1 %53, label %.lr.ph83, label %.preheader69

.lr.ph83:                                         ; preds = %.preheader70
  %60 = getelementptr inbounds i8, ptr %0, i64 24
  %61 = load ptr, ptr %60, align 8, !tbaa !14
  %62 = getelementptr inbounds i8, ptr %0, i64 56
  %63 = load ptr, ptr %62, align 8, !tbaa !33
  %wide.trip.count112 = zext nneg i32 %3 to i64
  %min.iters.check168 = icmp ult i32 %3, 8
  br i1 %min.iters.check168, label %scalar.ph167.preheader, label %vector.memcheck160

scalar.ph167.preheader:                           ; preds = %middle.block166, %vector.memcheck160, %.lr.ph83
  %indvars.iv109.ph = phi i64 [ 0, %vector.memcheck160 ], [ 0, %.lr.ph83 ], [ %n.vec171, %middle.block166 ]
  %xtraiter215 = and i64 %wide.trip.count107, 3
  %lcmp.mod216.not = icmp eq i64 %xtraiter215, 0
  br i1 %lcmp.mod216.not, label %scalar.ph167.prol.loopexit, label %scalar.ph167.prol

scalar.ph167.prol:                                ; preds = %scalar.ph167.preheader, %scalar.ph167.prol
  %indvars.iv109.prol = phi i64 [ %indvars.iv.next110.prol, %scalar.ph167.prol ], [ %indvars.iv109.ph, %scalar.ph167.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %scalar.ph167.prol ], [ 0, %scalar.ph167.preheader ]
  %64 = getelementptr inbounds float, ptr %61, i64 %indvars.iv109.prol
  %65 = load float, ptr %64, align 4, !tbaa !16
  %66 = getelementptr inbounds float, ptr %63, i64 %indvars.iv109.prol
  %67 = load float, ptr %66, align 4, !tbaa !16
  %68 = fadd float %65, %67
  store float %68, ptr %66, align 4, !tbaa !16
  %indvars.iv.next110.prol = add nuw nsw i64 %indvars.iv109.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter215
  br i1 %prol.iter.cmp.not, label %scalar.ph167.prol.loopexit, label %scalar.ph167.prol, !llvm.loop !34

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

vector.memcheck160:                               ; preds = %.lr.ph83
  %71 = shl nuw nsw i64 %wide.trip.count107, 2
  %scevgep161 = getelementptr i8, ptr %63, i64 %71
  %scevgep162 = getelementptr i8, ptr %61, i64 %71
  %bound0163 = icmp ult ptr %63, %scevgep162
  %bound1164 = icmp ult ptr %61, %scevgep161
  %found.conflict165 = and i1 %bound0163, %bound1164
  br i1 %found.conflict165, label %scalar.ph167.preheader, label %vector.ph169

vector.ph169:                                     ; preds = %vector.memcheck160
  %n.vec171 = and i64 %wide.trip.count107, 2147483640
  br label %vector.body173

vector.body173:                                   ; preds = %vector.body173, %vector.ph169
  %index174 = phi i64 [ 0, %vector.ph169 ], [ %index.next179, %vector.body173 ]
  %72 = getelementptr inbounds float, ptr %61, i64 %index174
  %73 = getelementptr inbounds i8, ptr %72, i64 16
  %wide.load175 = load <4 x float>, ptr %72, align 4, !tbaa !16, !alias.scope !36
  %wide.load176 = load <4 x float>, ptr %73, align 4, !tbaa !16, !alias.scope !36
  %74 = getelementptr inbounds float, ptr %63, i64 %index174
  %75 = getelementptr inbounds i8, ptr %74, i64 16
  %wide.load177 = load <4 x float>, ptr %74, align 4, !tbaa !16, !alias.scope !39, !noalias !36
  %wide.load178 = load <4 x float>, ptr %75, align 4, !tbaa !16, !alias.scope !39, !noalias !36
  %76 = fadd <4 x float> %wide.load175, %wide.load177
  %77 = fadd <4 x float> %wide.load176, %wide.load178
  store <4 x float> %76, ptr %74, align 4, !tbaa !16, !alias.scope !39, !noalias !36
  store <4 x float> %77, ptr %75, align 4, !tbaa !16, !alias.scope !39, !noalias !36
  %index.next179 = add nuw i64 %index174, 8
  %78 = icmp eq i64 %index.next179, %n.vec171
  br i1 %78, label %middle.block166, label %vector.body173, !llvm.loop !41

middle.block166:                                  ; preds = %vector.body173
  %cmp.n180 = icmp eq i64 %n.vec171, %wide.trip.count107
  br i1 %cmp.n180, label %.preheader69, label %scalar.ph167.preheader

scalar.ph149:                                     ; preds = %scalar.ph149.preheader, %scalar.ph149
  %indvars.iv104 = phi i64 [ %indvars.iv.next105, %scalar.ph149 ], [ %indvars.iv104.ph, %scalar.ph149.preheader ]
  %79 = getelementptr inbounds float, ptr %56, i64 %indvars.iv104
  %80 = load float, ptr %79, align 4, !tbaa !16
  %81 = fdiv float %80, %54
  store float %81, ptr %79, align 4, !tbaa !16
  %indvars.iv.next105 = add nuw nsw i64 %indvars.iv104, 1
  %exitcond108.not = icmp eq i64 %indvars.iv.next105, %wide.trip.count107
  br i1 %exitcond108.not, label %.preheader70, label %scalar.ph149, !llvm.loop !42

.preheader69:                                     ; preds = %scalar.ph167.prol.loopexit, %scalar.ph167, %middle.block166, %.preheader71, %.preheader70
  %82 = phi i1 [ false, %.preheader70 ], [ false, %.preheader71 ], [ %53, %middle.block166 ], [ %53, %scalar.ph167 ], [ %53, %scalar.ph167.prol.loopexit ]
  br i1 %9, label %.preheader68.lr.ph, label %.preheader67

.preheader68.lr.ph:                               ; preds = %.preheader69
  br i1 %82, label %.preheader68.lr.ph.split.us, label %._crit_edge

.preheader68.lr.ph.split.us:                      ; preds = %.preheader68.lr.ph
  %83 = getelementptr inbounds i8, ptr %0, i64 72
  %84 = load ptr, ptr %83, align 8, !tbaa !13
  %wide.trip.count121 = zext nneg i32 %3 to i64
  %min.iters.check183 = icmp ult i32 %3, 8
  %n.vec186 = and i64 %wide.trip.count121, 2147483640
  %cmp.n198 = icmp eq i64 %n.vec186, %wide.trip.count121
  br label %.preheader68.us

.preheader68.us:                                  ; preds = %._crit_edge.us89, %.preheader68.lr.ph.split.us
  %.06088.us = phi i32 [ 0, %.preheader68.lr.ph.split.us ], [ %99, %._crit_edge.us89 ]
  %.287.us = phi i64 [ 0, %.preheader68.lr.ph.split.us ], [ %indvars.iv.next117.lcssa, %._crit_edge.us89 ]
  %sext134 = shl i64 %.287.us, 32
  %85 = ashr exact i64 %sext134, 32
  br i1 %min.iters.check183, label %scalar.ph182.preheader, label %vector.ph184

vector.ph184:                                     ; preds = %.preheader68.us
  %ind.end187 = add nsw i64 %85, %n.vec186
  %86 = getelementptr float, ptr %84, i64 %85
  br label %vector.body190

vector.body190:                                   ; preds = %vector.body190, %vector.ph184
  %index191 = phi i64 [ 0, %vector.ph184 ], [ %index.next197, %vector.body190 ]
  %87 = getelementptr float, ptr %86, i64 %index191
  %88 = getelementptr inbounds i8, ptr %87, i64 16
  %wide.load193 = load <4 x float>, ptr %87, align 4, !tbaa !16
  %wide.load194 = load <4 x float>, ptr %88, align 4, !tbaa !16
  %89 = getelementptr inbounds float, ptr %5, i64 %index191
  %90 = getelementptr inbounds i8, ptr %89, i64 16
  %wide.load195 = load <4 x float>, ptr %89, align 4, !tbaa !16
  %wide.load196 = load <4 x float>, ptr %90, align 4, !tbaa !16
  %91 = fadd <4 x float> %wide.load193, %wide.load195
  %92 = fadd <4 x float> %wide.load194, %wide.load196
  store <4 x float> %91, ptr %89, align 4, !tbaa !16
  store <4 x float> %92, ptr %90, align 4, !tbaa !16
  %index.next197 = add nuw i64 %index191, 8
  %93 = icmp eq i64 %index.next197, %n.vec186
  br i1 %93, label %middle.block181, label %vector.body190, !llvm.loop !43

middle.block181:                                  ; preds = %vector.body190
  br i1 %cmp.n198, label %._crit_edge.us89, label %scalar.ph182.preheader

scalar.ph182.preheader:                           ; preds = %middle.block181, %.preheader68.us
  %indvars.iv116.ph = phi i64 [ %85, %.preheader68.us ], [ %ind.end187, %middle.block181 ]
  %indvars.iv114.ph = phi i64 [ 0, %.preheader68.us ], [ %n.vec186, %middle.block181 ]
  br label %scalar.ph182

scalar.ph182:                                     ; preds = %scalar.ph182.preheader, %scalar.ph182
  %indvars.iv116 = phi i64 [ %indvars.iv.next117, %scalar.ph182 ], [ %indvars.iv116.ph, %scalar.ph182.preheader ]
  %indvars.iv114 = phi i64 [ %indvars.iv.next115, %scalar.ph182 ], [ %indvars.iv114.ph, %scalar.ph182.preheader ]
  %indvars.iv.next117 = add nsw i64 %indvars.iv116, 1
  %94 = getelementptr inbounds float, ptr %84, i64 %indvars.iv116
  %95 = load float, ptr %94, align 4, !tbaa !16
  %96 = getelementptr inbounds float, ptr %5, i64 %indvars.iv114
  %97 = load float, ptr %96, align 4, !tbaa !16
  %98 = fadd float %95, %97
  store float %98, ptr %96, align 4, !tbaa !16
  %indvars.iv.next115 = add nuw nsw i64 %indvars.iv114, 1
  %exitcond122.not = icmp eq i64 %indvars.iv.next115, %wide.trip.count121
  br i1 %exitcond122.not, label %._crit_edge.us89, label %scalar.ph182, !llvm.loop !44

._crit_edge.us89:                                 ; preds = %scalar.ph182, %middle.block181
  %indvars.iv.next117.lcssa = phi i64 [ %ind.end187, %middle.block181 ], [ %indvars.iv.next117, %scalar.ph182 ]
  %99 = add nuw nsw i32 %.06088.us, 1
  %exitcond123.not = icmp eq i32 %99, %8
  br i1 %exitcond123.not, label %.preheader67, label %.preheader68.us, !llvm.loop !45

scalar.ph167:                                     ; preds = %scalar.ph167.prol.loopexit, %scalar.ph167
  %indvars.iv109 = phi i64 [ %indvars.iv.next110.3, %scalar.ph167 ], [ %indvars.iv109.unr, %scalar.ph167.prol.loopexit ]
  %100 = getelementptr inbounds float, ptr %61, i64 %indvars.iv109
  %101 = load float, ptr %100, align 4, !tbaa !16
  %102 = getelementptr inbounds float, ptr %63, i64 %indvars.iv109
  %103 = load float, ptr %102, align 4, !tbaa !16
  %104 = fadd float %101, %103
  store float %104, ptr %102, align 4, !tbaa !16
  %indvars.iv.next110 = add nuw nsw i64 %indvars.iv109, 1
  %105 = getelementptr inbounds float, ptr %61, i64 %indvars.iv.next110
  %106 = load float, ptr %105, align 4, !tbaa !16
  %107 = getelementptr inbounds float, ptr %63, i64 %indvars.iv.next110
  %108 = load float, ptr %107, align 4, !tbaa !16
  %109 = fadd float %106, %108
  store float %109, ptr %107, align 4, !tbaa !16
  %indvars.iv.next110.1 = add nuw nsw i64 %indvars.iv109, 2
  %110 = getelementptr inbounds float, ptr %61, i64 %indvars.iv.next110.1
  %111 = load float, ptr %110, align 4, !tbaa !16
  %112 = getelementptr inbounds float, ptr %63, i64 %indvars.iv.next110.1
  %113 = load float, ptr %112, align 4, !tbaa !16
  %114 = fadd float %111, %113
  store float %114, ptr %112, align 4, !tbaa !16
  %indvars.iv.next110.2 = add nuw nsw i64 %indvars.iv109, 3
  %115 = getelementptr inbounds float, ptr %61, i64 %indvars.iv.next110.2
  %116 = load float, ptr %115, align 4, !tbaa !16
  %117 = getelementptr inbounds float, ptr %63, i64 %indvars.iv.next110.2
  %118 = load float, ptr %117, align 4, !tbaa !16
  %119 = fadd float %116, %118
  store float %119, ptr %117, align 4, !tbaa !16
  %indvars.iv.next110.3 = add nuw nsw i64 %indvars.iv109, 4
  %exitcond113.not.3 = icmp eq i64 %indvars.iv.next110.3, %wide.trip.count112
  br i1 %exitcond113.not.3, label %.preheader69, label %scalar.ph167, !llvm.loop !46

.preheader67:                                     ; preds = %._crit_edge.us89, %.preheader69
  br i1 %82, label %.lr.ph92, label %._crit_edge

.lr.ph92:                                         ; preds = %.preheader67
  %120 = sitofp i16 %7 to float
  %wide.trip.count127 = zext nneg i32 %3 to i64
  %min.iters.check201 = icmp ult i32 %3, 4
  br i1 %min.iters.check201, label %scalar.ph200.preheader, label %vector.ph202

scalar.ph200.preheader:                           ; preds = %middle.block199, %.lr.ph92
  %indvars.iv124.ph = phi i64 [ 0, %.lr.ph92 ], [ %n.vec204, %middle.block199 ]
  br label %scalar.ph200

vector.ph202:                                     ; preds = %.lr.ph92
  %n.vec204 = and i64 %wide.trip.count127, 2147483644
  %broadcast.splatinsert209 = insertelement <4 x float> poison, float %120, i64 0
  %broadcast.splat210 = shufflevector <4 x float> %broadcast.splatinsert209, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body206

vector.body206:                                   ; preds = %vector.body206, %vector.ph202
  %index207 = phi i64 [ 0, %vector.ph202 ], [ %index.next211, %vector.body206 ]
  %121 = getelementptr inbounds float, ptr %5, i64 %index207
  %wide.load208 = load <4 x float>, ptr %121, align 4, !tbaa !16
  %122 = fdiv <4 x float> %wide.load208, %broadcast.splat210
  store <4 x float> %122, ptr %121, align 4, !tbaa !16
  %index.next211 = add nuw i64 %index207, 4
  %123 = icmp eq i64 %index.next211, %n.vec204
  br i1 %123, label %middle.block199, label %vector.body206, !llvm.loop !47

middle.block199:                                  ; preds = %vector.body206
  %cmp.n212 = icmp eq i64 %n.vec204, %wide.trip.count127
  br i1 %cmp.n212, label %.preheader, label %scalar.ph200.preheader

.preheader:                                       ; preds = %scalar.ph200, %middle.block199
  br i1 %82, label %.lr.ph94, label %._crit_edge

.lr.ph94:                                         ; preds = %.preheader
  %124 = getelementptr inbounds i8, ptr %0, i64 32
  %125 = getelementptr inbounds i8, ptr %0, i64 24
  %126 = getelementptr inbounds i8, ptr %0, i64 88
  %127 = getelementptr inbounds i8, ptr %0, i64 8
  %wide.trip.count132 = zext nneg i32 %3 to i64
  br label %135

scalar.ph200:                                     ; preds = %scalar.ph200.preheader, %scalar.ph200
  %indvars.iv124 = phi i64 [ %indvars.iv.next125, %scalar.ph200 ], [ %indvars.iv124.ph, %scalar.ph200.preheader ]
  %128 = getelementptr inbounds float, ptr %5, i64 %indvars.iv124
  %129 = load float, ptr %128, align 4, !tbaa !16
  %130 = fdiv float %129, %120
  store float %130, ptr %128, align 4, !tbaa !16
  %indvars.iv.next125 = add nuw nsw i64 %indvars.iv124, 1
  %exitcond128.not = icmp eq i64 %indvars.iv.next125, %wide.trip.count127
  br i1 %exitcond128.not, label %.preheader, label %scalar.ph200, !llvm.loop !48

._crit_edge:                                      ; preds = %135, %.preheader72.lr.ph, %.preheader68.lr.ph, %.preheader67, %.preheader
  tail call void @free(ptr noundef %5) #7
  %131 = getelementptr inbounds i8, ptr %0, i64 88
  %132 = load ptr, ptr %131, align 8, !tbaa !49
  tail call void @free(ptr noundef %132) #7
  %133 = getelementptr inbounds i8, ptr %0, i64 72
  %134 = load ptr, ptr %133, align 8, !tbaa !13
  tail call void @free(ptr noundef %134) #7
  ret void

135:                                              ; preds = %.lr.ph94, %135
  %indvars.iv129 = phi i64 [ 0, %.lr.ph94 ], [ %indvars.iv.next130, %135 ]
  %136 = load ptr, ptr %124, align 8, !tbaa !50
  %137 = getelementptr inbounds float, ptr %136, i64 %indvars.iv129
  %138 = load float, ptr %137, align 4, !tbaa !16
  %139 = load ptr, ptr %125, align 8, !tbaa !14
  %140 = getelementptr inbounds float, ptr %139, i64 %indvars.iv129
  %141 = load float, ptr %140, align 4, !tbaa !16
  %142 = fmul float %138, %141
  %143 = getelementptr inbounds float, ptr %5, i64 %indvars.iv129
  %144 = load float, ptr %143, align 4, !tbaa !16
  %145 = fmul float %142, %144
  %146 = fpext float %145 to double
  %147 = load ptr, ptr %126, align 8, !tbaa !49
  %148 = getelementptr inbounds float, ptr %147, i64 %indvars.iv129
  %149 = load float, ptr %148, align 4, !tbaa !16
  %150 = fpext float %149 to double
  %151 = fadd double %150, 1.000000e-05
  %152 = tail call double @sqrt(double noundef %151) #7
  %153 = fdiv double %146, %152
  %154 = fsub double 0.000000e+00, %153
  %155 = fptrunc double %154 to float
  %156 = load ptr, ptr %127, align 8, !tbaa !51
  %157 = getelementptr inbounds float, ptr %156, i64 %indvars.iv129
  store float %155, ptr %157, align 4, !tbaa !16
  %indvars.iv.next130 = add nuw nsw i64 %indvars.iv129, 1
  %exitcond133.not = icmp eq i64 %indvars.iv.next130, %wide.trip.count132
  br i1 %exitcond133.not, label %._crit_edge, label %135, !llvm.loop !52
}

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

attributes #0 = { mustprogress nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) 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 = { mustprogress nofree nounwind willreturn memory(write) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, 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 #4 = { 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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { nounwind allocsize(0,1) }
attributes #7 = { 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, !10, i64 64}
!6 = !{!"batch_norm_op", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !10, i64 64, !11, i64 68, !7, i64 72, !7, i64 80, !7, i64 88}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"short", !8, i64 0}
!12 = !{!6, !11, i64 68}
!13 = !{!6, !7, i64 72}
!14 = !{!6, !7, i64 24}
!15 = !{!6, !7, i64 40}
!16 = !{!17, !17, i64 0}
!17 = !{!"float", !8, i64 0}
!18 = !{!19}
!19 = distinct !{!19, !20}
!20 = distinct !{!20, !"LVerDomain"}
!21 = !{!22}
!22 = distinct !{!22, !20}
!23 = !{!24}
!24 = distinct !{!24, !20}
!25 = !{!19, !22}
!26 = distinct !{!26, !27, !28, !29}
!27 = !{!"llvm.loop.mustprogress"}
!28 = !{!"llvm.loop.isvectorized", i32 1}
!29 = !{!"llvm.loop.unroll.runtime.disable"}
!30 = distinct !{!30, !27, !28}
!31 = distinct !{!31, !27}
!32 = distinct !{!32, !27, !28, !29}
!33 = !{!6, !7, i64 56}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.unroll.disable"}
!36 = !{!37}
!37 = distinct !{!37, !38}
!38 = distinct !{!38, !"LVerDomain"}
!39 = !{!40}
!40 = distinct !{!40, !38}
!41 = distinct !{!41, !27, !28, !29}
!42 = distinct !{!42, !27, !29, !28}
!43 = distinct !{!43, !27, !28, !29}
!44 = distinct !{!44, !27, !29, !28}
!45 = distinct !{!45, !27}
!46 = distinct !{!46, !27, !28}
!47 = distinct !{!47, !27, !28, !29}
!48 = distinct !{!48, !27, !29, !28}
!49 = !{!6, !7, i64 88}
!50 = !{!6, !7, i64 32}
!51 = !{!6, !7, i64 8}
!52 = distinct !{!52, !27}


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