; LLVM IR from FedericaPaoli1/stm32-speech-recognition-and-traduction :: Drivers/STM32_AI_AudioPreprocessing_Library/Src (feature_extraction)

; 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.LogMelSpectrogramTypeDef = type { ptr, i32, float, float }
%struct.MelSpectrogramTypeDef = type { ptr, ptr }
%struct.MelFilterTypeDef = type { ptr, ptr, ptr, i32, i32, i32, i32, float, float, i32, i32, i32 }
%struct.SpectrogramTypeDef = type { ptr, i32, ptr, i32, i32, 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: nounwind uwtable
declare dso_local void @SpectrogramColumn(ptr noundef, ptr noundef, ptr noundef) #1

declare void @MelFilterbank(ptr noundef, ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
define dso_local void @LogMelSpectrogramColumn(ptr noundef %0, ptr noundef %1, ptr noundef %2) #1 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca float, align 4
  %9 = alloca float, align 4
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, 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) #4
  %16 = load ptr, ptr %4, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.LogMelSpectrogramTypeDef, ptr %16, i32 0, i32 0
  %18 = load ptr, ptr %17, align 8, !tbaa !9
  %19 = getelementptr inbounds %struct.MelSpectrogramTypeDef, ptr %18, i32 0, i32 1
  %20 = load ptr, ptr %19, align 8, !tbaa !13
  %21 = getelementptr inbounds %struct.MelFilterTypeDef, ptr %20, i32 0, i32 4
  %22 = load i32, ptr %21, align 4, !tbaa !15
  store i32 %22, ptr %7, align 4, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #4
  %23 = load ptr, ptr %4, align 8, !tbaa !5
  %24 = getelementptr inbounds %struct.LogMelSpectrogramTypeDef, ptr %23, i32 0, i32 3
  %25 = load float, ptr %24, align 8, !tbaa !18
  store float %25, ptr %8, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #4
  %26 = load ptr, ptr %4, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct.LogMelSpectrogramTypeDef, ptr %26, i32 0, i32 2
  %28 = load float, ptr %27, align 4, !tbaa !20
  store float %28, ptr %9, align 4, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #4
  %29 = load ptr, ptr %4, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.LogMelSpectrogramTypeDef, ptr %29, i32 0, i32 0
  %31 = load ptr, ptr %30, align 8, !tbaa !9
  %32 = getelementptr inbounds %struct.MelSpectrogramTypeDef, ptr %31, i32 0, i32 0
  %33 = load ptr, ptr %32, align 8, !tbaa !21
  %34 = getelementptr inbounds %struct.SpectrogramTypeDef, ptr %33, i32 0, i32 6
  %35 = load ptr, ptr %34, align 8, !tbaa !22
  store ptr %35, ptr %10, align 8, !tbaa !5
  %36 = load ptr, ptr %4, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.LogMelSpectrogramTypeDef, ptr %36, i32 0, i32 0
  %38 = load ptr, ptr %37, align 8, !tbaa !9
  %39 = getelementptr inbounds %struct.MelSpectrogramTypeDef, ptr %38, i32 0, i32 0
  %40 = load ptr, ptr %39, align 8, !tbaa !21
  %41 = load ptr, ptr %5, align 8, !tbaa !5
  %42 = load ptr, ptr %10, align 8, !tbaa !5
  call void @SpectrogramColumn(ptr noundef %40, ptr noundef %41, ptr noundef %42)
  %43 = load ptr, ptr %4, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.LogMelSpectrogramTypeDef, ptr %43, i32 0, i32 0
  %45 = load ptr, ptr %44, align 8, !tbaa !9
  %46 = getelementptr inbounds %struct.MelSpectrogramTypeDef, ptr %45, i32 0, i32 1
  %47 = load ptr, ptr %46, align 8, !tbaa !13
  %48 = load ptr, ptr %10, align 8, !tbaa !5
  %49 = load ptr, ptr %6, align 8, !tbaa !5
  call void @MelFilterbank(ptr noundef %47, ptr noundef %48, ptr noundef %49)
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #4
  store i32 0, ptr %11, align 4, !tbaa !17
  br label %50

50:                                               ; preds = %63, %3
  %51 = load i32, ptr %11, align 4, !tbaa !17
  %52 = load i32, ptr %7, align 4, !tbaa !17
  %53 = icmp ult i32 %51, %52
  br i1 %53, label %55, label %54

54:                                               ; preds = %50
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #4
  br label %66

55:                                               ; preds = %50
  %56 = load float, ptr %9, align 4, !tbaa !19
  %57 = load ptr, ptr %6, align 8, !tbaa !5
  %58 = load i32, ptr %11, align 4, !tbaa !17
  %59 = zext i32 %58 to i64
  %60 = getelementptr inbounds float, ptr %57, i64 %59
  %61 = load float, ptr %60, align 4, !tbaa !19
  %62 = fdiv float %61, %56
  store float %62, ptr %60, align 4, !tbaa !19
  br label %63

63:                                               ; preds = %55
  %64 = load i32, ptr %11, align 4, !tbaa !17
  %65 = add i32 %64, 1
  store i32 %65, ptr %11, align 4, !tbaa !17
  br label %50, !llvm.loop !24

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

67:                                               ; preds = %85, %66
  %68 = load i32, ptr %12, align 4, !tbaa !17
  %69 = load i32, ptr %7, align 4, !tbaa !17
  %70 = icmp ult i32 %68, %69
  br i1 %70, label %72, label %71

71:                                               ; preds = %67
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #4
  br label %88

72:                                               ; preds = %67
  %73 = load ptr, ptr %6, align 8, !tbaa !5
  %74 = load i32, ptr %12, align 4, !tbaa !17
  %75 = zext i32 %74 to i64
  %76 = getelementptr inbounds float, ptr %73, i64 %75
  %77 = load float, ptr %76, align 4, !tbaa !19
  %78 = fcmp ole float %77, 0.000000e+00
  br i1 %78, label %79, label %84

79:                                               ; preds = %72
  %80 = load ptr, ptr %6, align 8, !tbaa !5
  %81 = load i32, ptr %12, align 4, !tbaa !17
  %82 = zext i32 %81 to i64
  %83 = getelementptr inbounds float, ptr %80, i64 %82
  store float 0x3810000000000000, ptr %83, align 4, !tbaa !19
  br label %84

84:                                               ; preds = %79, %72
  br label %85

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

88:                                               ; preds = %71
  %89 = load ptr, ptr %4, align 8, !tbaa !5
  %90 = getelementptr inbounds %struct.LogMelSpectrogramTypeDef, ptr %89, i32 0, i32 1
  %91 = load i32, ptr %90, align 8, !tbaa !27
  %92 = icmp eq i32 %91, 0
  br i1 %92, label %93, label %148

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

94:                                               ; preds = %111, %93
  %95 = load i32, ptr %13, align 4, !tbaa !17
  %96 = load i32, ptr %7, align 4, !tbaa !17
  %97 = icmp ult i32 %95, %96
  br i1 %97, label %99, label %98

98:                                               ; preds = %94
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #4
  br label %114

99:                                               ; preds = %94
  %100 = load ptr, ptr %6, align 8, !tbaa !5
  %101 = load i32, ptr %13, align 4, !tbaa !17
  %102 = zext i32 %101 to i64
  %103 = getelementptr inbounds float, ptr %100, i64 %102
  %104 = load float, ptr %103, align 4, !tbaa !19
  %105 = call float @log10f(float noundef %104) #4
  %106 = fmul float 1.000000e+01, %105
  %107 = load ptr, ptr %6, align 8, !tbaa !5
  %108 = load i32, ptr %13, align 4, !tbaa !17
  %109 = zext i32 %108 to i64
  %110 = getelementptr inbounds float, ptr %107, i64 %109
  store float %106, ptr %110, align 4, !tbaa !19
  br label %111

111:                                              ; preds = %99
  %112 = load i32, ptr %13, align 4, !tbaa !17
  %113 = add i32 %112, 1
  store i32 %113, ptr %13, align 4, !tbaa !17
  br label %94, !llvm.loop !28

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

115:                                              ; preds = %144, %114
  %116 = load i32, ptr %14, align 4, !tbaa !17
  %117 = load i32, ptr %7, align 4, !tbaa !17
  %118 = icmp ult i32 %116, %117
  br i1 %118, label %120, label %119

119:                                              ; preds = %115
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #4
  br label %147

120:                                              ; preds = %115
  %121 = load ptr, ptr %6, align 8, !tbaa !5
  %122 = load i32, ptr %14, align 4, !tbaa !17
  %123 = zext i32 %122 to i64
  %124 = getelementptr inbounds float, ptr %121, i64 %123
  %125 = load float, ptr %124, align 4, !tbaa !19
  %126 = load float, ptr %8, align 4, !tbaa !19
  %127 = fneg float %126
  %128 = fcmp olt float %125, %127
  br i1 %128, label %129, label %132

129:                                              ; preds = %120
  %130 = load float, ptr %8, align 4, !tbaa !19
  %131 = fneg float %130
  br label %138

132:                                              ; preds = %120
  %133 = load ptr, ptr %6, align 8, !tbaa !5
  %134 = load i32, ptr %14, align 4, !tbaa !17
  %135 = zext i32 %134 to i64
  %136 = getelementptr inbounds float, ptr %133, i64 %135
  %137 = load float, ptr %136, align 4, !tbaa !19
  br label %138

138:                                              ; preds = %132, %129
  %139 = phi float [ %131, %129 ], [ %137, %132 ]
  %140 = load ptr, ptr %6, align 8, !tbaa !5
  %141 = load i32, ptr %14, align 4, !tbaa !17
  %142 = zext i32 %141 to i64
  %143 = getelementptr inbounds float, ptr %140, i64 %142
  store float %139, ptr %143, align 4, !tbaa !19
  br label %144

144:                                              ; preds = %138
  %145 = load i32, ptr %14, align 4, !tbaa !17
  %146 = add i32 %145, 1
  store i32 %146, ptr %14, align 4, !tbaa !17
  br label %115, !llvm.loop !29

147:                                              ; preds = %119
  br label %169

148:                                              ; preds = %88
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #4
  store i32 0, ptr %15, align 4, !tbaa !17
  br label %149

149:                                              ; preds = %165, %148
  %150 = load i32, ptr %15, align 4, !tbaa !17
  %151 = load i32, ptr %7, align 4, !tbaa !17
  %152 = icmp ult i32 %150, %151
  br i1 %152, label %154, label %153

153:                                              ; preds = %149
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #4
  br label %168

154:                                              ; preds = %149
  %155 = load ptr, ptr %6, align 8, !tbaa !5
  %156 = load i32, ptr %15, align 4, !tbaa !17
  %157 = zext i32 %156 to i64
  %158 = getelementptr inbounds float, ptr %155, i64 %157
  %159 = load float, ptr %158, align 4, !tbaa !19
  %160 = call float @logf(float noundef %159) #4
  %161 = load ptr, ptr %6, align 8, !tbaa !5
  %162 = load i32, ptr %15, align 4, !tbaa !17
  %163 = zext i32 %162 to i64
  %164 = getelementptr inbounds float, ptr %161, i64 %163
  store float %160, ptr %164, align 4, !tbaa !19
  br label %165

165:                                              ; preds = %154
  %166 = load i32, ptr %15, align 4, !tbaa !17
  %167 = add i32 %166, 1
  store i32 %167, ptr %15, align 4, !tbaa !17
  br label %149, !llvm.loop !30

168:                                              ; preds = %153
  br label %169

169:                                              ; preds = %168, %147
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #4
  ret void
}

; Function Attrs: nounwind
declare float @log10f(float noundef) #3

; Function Attrs: nounwind
declare float @logf(float noundef) #3

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { "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 "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 }

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


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

; Function Attrs: nounwind uwtable
declare dso_local void @SpectrogramColumn(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

declare void @MelFilterbank(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local void @LogMelSpectrogramColumn(ptr nocapture noundef readonly %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #0 {
  %4 = load ptr, ptr %0, align 8, !tbaa !5
  %5 = getelementptr inbounds i8, ptr %4, i64 8
  %6 = load ptr, ptr %5, align 8, !tbaa !12
  %7 = getelementptr inbounds i8, ptr %6, i64 28
  %8 = load i32, ptr %7, align 4, !tbaa !14
  %9 = getelementptr inbounds i8, ptr %0, i64 16
  %10 = load float, ptr %9, align 8, !tbaa !16
  %11 = getelementptr inbounds i8, ptr %0, i64 12
  %12 = load float, ptr %11, align 4, !tbaa !17
  %13 = load ptr, ptr %4, align 8, !tbaa !18
  %14 = getelementptr inbounds i8, ptr %13, i64 40
  %15 = load ptr, ptr %14, align 8, !tbaa !19
  tail call void @SpectrogramColumn(ptr noundef %13, ptr noundef %1, ptr noundef %15)
  %16 = load ptr, ptr %0, align 8, !tbaa !5
  %17 = getelementptr inbounds i8, ptr %16, i64 8
  %18 = load ptr, ptr %17, align 8, !tbaa !12
  tail call void @MelFilterbank(ptr noundef %18, ptr noundef %15, ptr noundef %2) #3
  %.not = icmp eq i32 %8, 0
  br i1 %.not, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %3
  %wide.trip.count = zext i32 %8 to i64
  %min.iters.check = icmp ult i32 %8, 4
  br i1 %min.iters.check, label %.lr.ph.preheader140, label %vector.ph

.lr.ph.preheader140:                              ; preds = %middle.block, %.lr.ph.preheader
  %indvars.iv.ph = phi i64 [ 0, %.lr.ph.preheader ], [ %n.vec, %middle.block ]
  br label %.lr.ph

vector.ph:                                        ; preds = %.lr.ph.preheader
  %n.vec = and i64 %wide.trip.count, 4294967292
  %broadcast.splatinsert = insertelement <4 x float> poison, float %12, i64 0
  %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %19 = getelementptr inbounds float, ptr %2, i64 %index
  %wide.load = load <4 x float>, ptr %19, align 4, !tbaa !21
  %20 = fdiv <4 x float> %wide.load, %broadcast.splat
  store <4 x float> %20, ptr %19, align 4, !tbaa !21
  %index.next = add nuw i64 %index, 4
  %21 = icmp eq i64 %index.next, %n.vec
  br i1 %21, label %middle.block, label %vector.body, !llvm.loop !22

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %.preheader58, label %.lr.ph.preheader140

.preheader58:                                     ; preds = %.lr.ph, %middle.block
  br i1 %.not, label %._crit_edge, label %.lr.ph61.preheader

.lr.ph61.preheader:                               ; preds = %.preheader58
  %wide.trip.count77 = zext i32 %8 to i64
  %min.iters.check98 = icmp ult i32 %8, 8
  br i1 %min.iters.check98, label %.lr.ph61.preheader139, label %vector.ph99

.lr.ph61.preheader139:                            ; preds = %middle.block96, %.lr.ph61.preheader
  %indvars.iv74.ph = phi i64 [ 0, %.lr.ph61.preheader ], [ %n.vec101, %middle.block96 ]
  br label %.lr.ph61

vector.ph99:                                      ; preds = %.lr.ph61.preheader
  %n.vec101 = and i64 %wide.trip.count, 4294967288
  br label %vector.body103

vector.body103:                                   ; preds = %pred.store.continue120, %vector.ph99
  %index104 = phi i64 [ 0, %vector.ph99 ], [ %index.next121, %pred.store.continue120 ]
  %22 = or disjoint i64 %index104, 4
  %23 = getelementptr inbounds float, ptr %2, i64 %index104
  %24 = getelementptr inbounds i8, ptr %23, i64 16
  %wide.load105 = load <4 x float>, ptr %23, align 4, !tbaa !21
  %wide.load106 = load <4 x float>, ptr %24, align 4, !tbaa !21
  %25 = fcmp ole <4 x float> %wide.load105, zeroinitializer
  %26 = fcmp ole <4 x float> %wide.load106, zeroinitializer
  %27 = extractelement <4 x i1> %25, i64 0
  br i1 %27, label %pred.store.if, label %pred.store.continue

pred.store.if:                                    ; preds = %vector.body103
  %28 = getelementptr inbounds float, ptr %2, i64 %index104
  store float 0x3810000000000000, ptr %28, align 4, !tbaa !21
  br label %pred.store.continue

pred.store.continue:                              ; preds = %pred.store.if, %vector.body103
  %29 = extractelement <4 x i1> %25, i64 1
  br i1 %29, label %pred.store.if107, label %pred.store.continue108

pred.store.if107:                                 ; preds = %pred.store.continue
  %30 = or disjoint i64 %index104, 1
  %31 = getelementptr inbounds float, ptr %2, i64 %30
  store float 0x3810000000000000, ptr %31, align 4, !tbaa !21
  br label %pred.store.continue108

pred.store.continue108:                           ; preds = %pred.store.if107, %pred.store.continue
  %32 = extractelement <4 x i1> %25, i64 2
  br i1 %32, label %pred.store.if109, label %pred.store.continue110

pred.store.if109:                                 ; preds = %pred.store.continue108
  %33 = or disjoint i64 %index104, 2
  %34 = getelementptr inbounds float, ptr %2, i64 %33
  store float 0x3810000000000000, ptr %34, align 4, !tbaa !21
  br label %pred.store.continue110

pred.store.continue110:                           ; preds = %pred.store.if109, %pred.store.continue108
  %35 = extractelement <4 x i1> %25, i64 3
  br i1 %35, label %pred.store.if111, label %pred.store.continue112

pred.store.if111:                                 ; preds = %pred.store.continue110
  %36 = or disjoint i64 %index104, 3
  %37 = getelementptr inbounds float, ptr %2, i64 %36
  store float 0x3810000000000000, ptr %37, align 4, !tbaa !21
  br label %pred.store.continue112

pred.store.continue112:                           ; preds = %pred.store.if111, %pred.store.continue110
  %38 = extractelement <4 x i1> %26, i64 0
  br i1 %38, label %pred.store.if113, label %pred.store.continue114

pred.store.if113:                                 ; preds = %pred.store.continue112
  %39 = getelementptr inbounds float, ptr %2, i64 %22
  store float 0x3810000000000000, ptr %39, align 4, !tbaa !21
  br label %pred.store.continue114

pred.store.continue114:                           ; preds = %pred.store.if113, %pred.store.continue112
  %40 = extractelement <4 x i1> %26, i64 1
  br i1 %40, label %pred.store.if115, label %pred.store.continue116

pred.store.if115:                                 ; preds = %pred.store.continue114
  %41 = or disjoint i64 %index104, 5
  %42 = getelementptr inbounds float, ptr %2, i64 %41
  store float 0x3810000000000000, ptr %42, align 4, !tbaa !21
  br label %pred.store.continue116

pred.store.continue116:                           ; preds = %pred.store.if115, %pred.store.continue114
  %43 = extractelement <4 x i1> %26, i64 2
  br i1 %43, label %pred.store.if117, label %pred.store.continue118

pred.store.if117:                                 ; preds = %pred.store.continue116
  %44 = or disjoint i64 %index104, 6
  %45 = getelementptr inbounds float, ptr %2, i64 %44
  store float 0x3810000000000000, ptr %45, align 4, !tbaa !21
  br label %pred.store.continue118

pred.store.continue118:                           ; preds = %pred.store.if117, %pred.store.continue116
  %46 = extractelement <4 x i1> %26, i64 3
  br i1 %46, label %pred.store.if119, label %pred.store.continue120

pred.store.if119:                                 ; preds = %pred.store.continue118
  %47 = or disjoint i64 %index104, 7
  %48 = getelementptr inbounds float, ptr %2, i64 %47
  store float 0x3810000000000000, ptr %48, align 4, !tbaa !21
  br label %pred.store.continue120

pred.store.continue120:                           ; preds = %pred.store.if119, %pred.store.continue118
  %index.next121 = add nuw i64 %index104, 8
  %49 = icmp eq i64 %index.next121, %n.vec101
  br i1 %49, label %middle.block96, label %vector.body103, !llvm.loop !26

middle.block96:                                   ; preds = %pred.store.continue120
  %cmp.n122 = icmp eq i64 %n.vec101, %wide.trip.count
  br i1 %cmp.n122, label %._crit_edge, label %.lr.ph61.preheader139

.lr.ph:                                           ; preds = %.lr.ph.preheader140, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ %indvars.iv.ph, %.lr.ph.preheader140 ]
  %50 = getelementptr inbounds float, ptr %2, i64 %indvars.iv
  %51 = load float, ptr %50, align 4, !tbaa !21
  %52 = fdiv float %51, %12
  store float %52, ptr %50, align 4, !tbaa !21
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %.preheader58, label %.lr.ph, !llvm.loop !27

._crit_edge:                                      ; preds = %60, %middle.block96, %3, %.preheader58
  %53 = getelementptr inbounds i8, ptr %0, i64 8
  %54 = load i32, ptr %53, align 8, !tbaa !28
  %55 = icmp eq i32 %54, 0
  br i1 %55, label %.preheader55, label %.preheader56

.preheader56:                                     ; preds = %._crit_edge
  br i1 %.not, label %.loopexit, label %.lr.ph63.preheader

.lr.ph63.preheader:                               ; preds = %.preheader56
  %wide.trip.count82 = zext i32 %8 to i64
  br label %.lr.ph63

.preheader55:                                     ; preds = %._crit_edge
  br i1 %.not, label %.loopexit, label %.lr.ph65.preheader

.lr.ph65.preheader:                               ; preds = %.preheader55
  %wide.trip.count87 = zext i32 %8 to i64
  br label %.lr.ph65

.lr.ph61:                                         ; preds = %.lr.ph61.preheader139, %60
  %indvars.iv74 = phi i64 [ %indvars.iv.next75, %60 ], [ %indvars.iv74.ph, %.lr.ph61.preheader139 ]
  %56 = getelementptr inbounds float, ptr %2, i64 %indvars.iv74
  %57 = load float, ptr %56, align 4, !tbaa !21
  %58 = fcmp ugt float %57, 0.000000e+00
  br i1 %58, label %60, label %59

59:                                               ; preds = %.lr.ph61
  store float 0x3810000000000000, ptr %56, align 4, !tbaa !21
  br label %60

60:                                               ; preds = %.lr.ph61, %59
  %indvars.iv.next75 = add nuw nsw i64 %indvars.iv74, 1
  %exitcond78.not = icmp eq i64 %indvars.iv.next75, %wide.trip.count77
  br i1 %exitcond78.not, label %._crit_edge, label %.lr.ph61, !llvm.loop !29

.preheader:                                       ; preds = %.lr.ph65
  br i1 %.not, label %.loopexit, label %.lr.ph67

.lr.ph67:                                         ; preds = %.preheader
  %61 = fneg float %10
  %wide.trip.count92 = zext i32 %8 to i64
  %min.iters.check125 = icmp ult i32 %8, 8
  br i1 %min.iters.check125, label %scalar.ph124.preheader, label %vector.ph126

scalar.ph124.preheader:                           ; preds = %middle.block123, %.lr.ph67
  %indvars.iv89.ph = phi i64 [ 0, %.lr.ph67 ], [ %n.vec128, %middle.block123 ]
  br label %scalar.ph124

vector.ph126:                                     ; preds = %.lr.ph67
  %n.vec128 = and i64 %wide.trip.count87, 4294967288
  %broadcast.splatinsert134 = insertelement <4 x float> poison, float %61, i64 0
  %broadcast.splat135 = shufflevector <4 x float> %broadcast.splatinsert134, <4 x float> poison, <4 x i32> zeroinitializer
  br label %vector.body130

vector.body130:                                   ; preds = %vector.body130, %vector.ph126
  %index131 = phi i64 [ 0, %vector.ph126 ], [ %index.next136, %vector.body130 ]
  %62 = getelementptr inbounds float, ptr %2, i64 %index131
  %63 = getelementptr inbounds i8, ptr %62, i64 16
  %wide.load132 = load <4 x float>, ptr %62, align 4, !tbaa !21
  %wide.load133 = load <4 x float>, ptr %63, align 4, !tbaa !21
  %64 = fcmp olt <4 x float> %wide.load132, %broadcast.splat135
  %65 = fcmp olt <4 x float> %wide.load133, %broadcast.splat135
  %66 = select <4 x i1> %64, <4 x float> %broadcast.splat135, <4 x float> %wide.load132
  %67 = select <4 x i1> %65, <4 x float> %broadcast.splat135, <4 x float> %wide.load133
  store <4 x float> %66, ptr %62, align 4, !tbaa !21
  store <4 x float> %67, ptr %63, align 4, !tbaa !21
  %index.next136 = add nuw i64 %index131, 8
  %68 = icmp eq i64 %index.next136, %n.vec128
  br i1 %68, label %middle.block123, label %vector.body130, !llvm.loop !30

middle.block123:                                  ; preds = %vector.body130
  %cmp.n137 = icmp eq i64 %n.vec128, %wide.trip.count87
  br i1 %cmp.n137, label %.loopexit, label %scalar.ph124.preheader

.lr.ph65:                                         ; preds = %.lr.ph65.preheader, %.lr.ph65
  %indvars.iv84 = phi i64 [ 0, %.lr.ph65.preheader ], [ %indvars.iv.next85, %.lr.ph65 ]
  %69 = getelementptr inbounds float, ptr %2, i64 %indvars.iv84
  %70 = load float, ptr %69, align 4, !tbaa !21
  %71 = tail call float @log10f(float noundef %70) #3
  %72 = fmul float %71, 1.000000e+01
  store float %72, ptr %69, align 4, !tbaa !21
  %indvars.iv.next85 = add nuw nsw i64 %indvars.iv84, 1
  %exitcond88.not = icmp eq i64 %indvars.iv.next85, %wide.trip.count87
  br i1 %exitcond88.not, label %.preheader, label %.lr.ph65, !llvm.loop !31

scalar.ph124:                                     ; preds = %scalar.ph124.preheader, %scalar.ph124
  %indvars.iv89 = phi i64 [ %indvars.iv.next90, %scalar.ph124 ], [ %indvars.iv89.ph, %scalar.ph124.preheader ]
  %73 = getelementptr inbounds float, ptr %2, i64 %indvars.iv89
  %74 = load float, ptr %73, align 4, !tbaa !21
  %75 = fcmp olt float %74, %61
  %. = select i1 %75, float %61, float %74
  store float %., ptr %73, align 4, !tbaa !21
  %indvars.iv.next90 = add nuw nsw i64 %indvars.iv89, 1
  %exitcond93.not = icmp eq i64 %indvars.iv.next90, %wide.trip.count92
  br i1 %exitcond93.not, label %.loopexit, label %scalar.ph124, !llvm.loop !32

.lr.ph63:                                         ; preds = %.lr.ph63.preheader, %.lr.ph63
  %indvars.iv79 = phi i64 [ 0, %.lr.ph63.preheader ], [ %indvars.iv.next80, %.lr.ph63 ]
  %76 = getelementptr inbounds float, ptr %2, i64 %indvars.iv79
  %77 = load float, ptr %76, align 4, !tbaa !21
  %78 = tail call float @logf(float noundef %77) #3
  store float %78, ptr %76, align 4, !tbaa !21
  %indvars.iv.next80 = add nuw nsw i64 %indvars.iv79, 1
  %exitcond83.not = icmp eq i64 %indvars.iv.next80, %wide.trip.count82
  br i1 %exitcond83.not, label %.loopexit, label %.lr.ph63, !llvm.loop !33

.loopexit:                                        ; preds = %.lr.ph63, %scalar.ph124, %middle.block123, %.preheader55, %.preheader56, %.preheader
  ret void
}

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

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "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 = { 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 = { 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, !7, i64 0}
!6 = !{!"", !7, i64 0, !10, i64 8, !11, i64 12, !11, i64 16}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"float", !8, i64 0}
!12 = !{!13, !7, i64 8}
!13 = !{!"", !7, i64 0, !7, i64 8}
!14 = !{!15, !10, i64 28}
!15 = !{!"", !7, i64 0, !7, i64 8, !7, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !10, i64 36, !11, i64 40, !11, i64 44, !10, i64 48, !10, i64 52, !10, i64 56}
!16 = !{!6, !11, i64 16}
!17 = !{!6, !11, i64 12}
!18 = !{!13, !7, i64 0}
!19 = !{!20, !7, i64 40}
!20 = !{!"", !7, i64 0, !10, i64 8, !7, i64 16, !10, i64 24, !10, i64 28, !10, i64 32, !7, i64 40}
!21 = !{!11, !11, i64 0}
!22 = distinct !{!22, !23, !24, !25}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!"llvm.loop.isvectorized", i32 1}
!25 = !{!"llvm.loop.unroll.runtime.disable"}
!26 = distinct !{!26, !23, !24, !25}
!27 = distinct !{!27, !23, !25, !24}
!28 = !{!6, !10, i64 8}
!29 = distinct !{!29, !23, !25, !24}
!30 = distinct !{!30, !23, !24, !25}
!31 = distinct !{!31, !23}
!32 = distinct !{!32, !23, !25, !24}
!33 = distinct !{!33, !23}


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