; LLVM IR from QiaoLiuHit/LSOTB-TIR :: vlfeat-0.9.19/vl (aib)

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

; 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

declare ptr @vl_malloc(i64 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local void @vl_aib_update_beta(ptr noundef %0) #2 {
  %2 = alloca ptr, align 8
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca double, align 8
  %11 = alloca double, align 8
  %12 = alloca i32, align 4
  %13 = alloca double, align 8
  %14 = alloca double, align 8
  %15 = alloca double, align 8
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %4) #5
  %16 = load ptr, ptr %2, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct._VlAIB, ptr %16, i32 0, i32 7
  %18 = load ptr, ptr %17, align 8, !tbaa !9
  store ptr %18, ptr %4, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %5) #5
  %19 = load ptr, ptr %2, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct._VlAIB, ptr %19, i32 0, i32 6
  %21 = load ptr, ptr %20, align 8, !tbaa !12
  store ptr %21, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #5
  %22 = load ptr, ptr %2, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct._VlAIB, ptr %22, i32 0, i32 1
  %24 = load i32, ptr %23, align 8, !tbaa !13
  %25 = zext i32 %24 to i64
  %26 = mul i64 8, %25
  %27 = call ptr @vl_malloc(i64 noundef %26)
  store ptr %27, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #5
  store i32 0, ptr %7, align 4, !tbaa !14
  br label %28

28:                                               ; preds = %80, %1
  %29 = load i32, ptr %7, align 4, !tbaa !14
  %30 = load ptr, ptr %2, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct._VlAIB, ptr %30, i32 0, i32 1
  %32 = load i32, ptr %31, align 8, !tbaa !13
  %33 = icmp ult i32 %29, %32
  br i1 %33, label %34, label %83

34:                                               ; preds = %28
  %35 = load ptr, ptr %6, align 8, !tbaa !5
  %36 = load i32, ptr %7, align 4, !tbaa !14
  %37 = zext i32 %36 to i64
  %38 = getelementptr inbounds double, ptr %35, i64 %37
  store double 0.000000e+00, ptr %38, align 8, !tbaa !15
  store i32 0, ptr %9, align 4, !tbaa !14
  br label %39

39:                                               ; preds = %76, %34
  %40 = load i32, ptr %9, align 4, !tbaa !14
  %41 = load ptr, ptr %2, align 8, !tbaa !5
  %42 = getelementptr inbounds %struct._VlAIB, ptr %41, i32 0, i32 10
  %43 = load i32, ptr %42, align 4, !tbaa !17
  %44 = icmp ult i32 %40, %43
  br i1 %44, label %45, label %79

45:                                               ; preds = %39
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  %46 = load ptr, ptr %5, align 8, !tbaa !5
  %47 = load i32, ptr %7, align 4, !tbaa !14
  %48 = load ptr, ptr %2, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct._VlAIB, ptr %48, i32 0, i32 10
  %50 = load i32, ptr %49, align 4, !tbaa !17
  %51 = mul i32 %47, %50
  %52 = load i32, ptr %9, align 4, !tbaa !14
  %53 = add i32 %51, %52
  %54 = zext i32 %53 to i64
  %55 = getelementptr inbounds double, ptr %46, i64 %54
  %56 = load double, ptr %55, align 8, !tbaa !15
  store double %56, ptr %10, align 8, !tbaa !15
  %57 = load double, ptr %10, align 8, !tbaa !15
  %58 = fcmp une double %57, 0.000000e+00
  br i1 %58, label %59, label %75

59:                                               ; preds = %45
  %60 = load double, ptr %10, align 8, !tbaa !15
  %61 = load double, ptr %10, align 8, !tbaa !15
  %62 = load ptr, ptr %4, align 8, !tbaa !5
  %63 = load i32, ptr %7, align 4, !tbaa !14
  %64 = zext i32 %63 to i64
  %65 = getelementptr inbounds double, ptr %62, i64 %64
  %66 = load double, ptr %65, align 8, !tbaa !15
  %67 = fdiv double %61, %66
  %68 = call double @log(double noundef %67) #5
  %69 = load ptr, ptr %6, align 8, !tbaa !5
  %70 = load i32, ptr %7, align 4, !tbaa !14
  %71 = zext i32 %70 to i64
  %72 = getelementptr inbounds double, ptr %69, i64 %71
  %73 = load double, ptr %72, align 8, !tbaa !15
  %74 = call double @llvm.fmuladd.f64(double %60, double %68, double %73)
  store double %74, ptr %72, align 8, !tbaa !15
  br label %75

75:                                               ; preds = %59, %45
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  br label %76

76:                                               ; preds = %75
  %77 = load i32, ptr %9, align 4, !tbaa !14
  %78 = add i32 %77, 1
  store i32 %78, ptr %9, align 4, !tbaa !14
  br label %39, !llvm.loop !18

79:                                               ; preds = %39
  br label %80

80:                                               ; preds = %79
  %81 = load i32, ptr %7, align 4, !tbaa !14
  %82 = add i32 %81, 1
  store i32 %82, ptr %7, align 4, !tbaa !14
  br label %28, !llvm.loop !20

83:                                               ; preds = %28
  store i32 0, ptr %3, align 4, !tbaa !14
  br label %84

84:                                               ; preds = %272, %83
  %85 = load i32, ptr %3, align 4, !tbaa !14
  %86 = load ptr, ptr %2, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct._VlAIB, ptr %86, i32 0, i32 5
  %88 = load i32, ptr %87, align 8, !tbaa !21
  %89 = icmp ult i32 %85, %88
  br i1 %89, label %90, label %275

90:                                               ; preds = %84
  %91 = load ptr, ptr %2, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct._VlAIB, ptr %91, i32 0, i32 4
  %93 = load ptr, ptr %92, align 8, !tbaa !22
  %94 = load i32, ptr %3, align 4, !tbaa !14
  %95 = zext i32 %94 to i64
  %96 = getelementptr inbounds i32, ptr %93, i64 %95
  %97 = load i32, ptr %96, align 4, !tbaa !14
  store i32 %97, ptr %7, align 4, !tbaa !14
  store i32 0, ptr %8, align 4, !tbaa !14
  br label %98

98:                                               ; preds = %268, %90
  %99 = load i32, ptr %8, align 4, !tbaa !14
  %100 = load ptr, ptr %2, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct._VlAIB, ptr %100, i32 0, i32 1
  %102 = load i32, ptr %101, align 8, !tbaa !13
  %103 = icmp ult i32 %99, %102
  br i1 %103, label %104, label %271

104:                                              ; preds = %98
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  store double 0.000000e+00, ptr %11, align 8, !tbaa !15
  %105 = load i32, ptr %7, align 4, !tbaa !14
  %106 = load i32, ptr %8, align 4, !tbaa !14
  %107 = icmp eq i32 %105, %106
  br i1 %107, label %122, label %108

108:                                              ; preds = %104
  %109 = load ptr, ptr %4, align 8, !tbaa !5
  %110 = load i32, ptr %7, align 4, !tbaa !14
  %111 = zext i32 %110 to i64
  %112 = getelementptr inbounds double, ptr %109, i64 %111
  %113 = load double, ptr %112, align 8, !tbaa !15
  %114 = fcmp oeq double %113, 0.000000e+00
  br i1 %114, label %122, label %115

115:                                              ; preds = %108
  %116 = load ptr, ptr %4, align 8, !tbaa !5
  %117 = load i32, ptr %8, align 4, !tbaa !14
  %118 = zext i32 %117 to i64
  %119 = getelementptr inbounds double, ptr %116, i64 %118
  %120 = load double, ptr %119, align 8, !tbaa !15
  %121 = fcmp oeq double %120, 0.000000e+00
  br i1 %121, label %122, label %123

122:                                              ; preds = %115, %108, %104
  store i32 13, ptr %12, align 4
  br label %265

123:                                              ; preds = %115
  %124 = load ptr, ptr %4, align 8, !tbaa !5
  %125 = load i32, ptr %7, align 4, !tbaa !14
  %126 = zext i32 %125 to i64
  %127 = getelementptr inbounds double, ptr %124, i64 %126
  %128 = load double, ptr %127, align 8, !tbaa !15
  %129 = load ptr, ptr %4, align 8, !tbaa !5
  %130 = load i32, ptr %8, align 4, !tbaa !14
  %131 = zext i32 %130 to i64
  %132 = getelementptr inbounds double, ptr %129, i64 %131
  %133 = load double, ptr %132, align 8, !tbaa !15
  %134 = fadd double %128, %133
  %135 = load ptr, ptr %4, align 8, !tbaa !5
  %136 = load i32, ptr %7, align 4, !tbaa !14
  %137 = zext i32 %136 to i64
  %138 = getelementptr inbounds double, ptr %135, i64 %137
  %139 = load double, ptr %138, align 8, !tbaa !15
  %140 = load ptr, ptr %4, align 8, !tbaa !5
  %141 = load i32, ptr %8, align 4, !tbaa !14
  %142 = zext i32 %141 to i64
  %143 = getelementptr inbounds double, ptr %140, i64 %142
  %144 = load double, ptr %143, align 8, !tbaa !15
  %145 = fadd double %139, %144
  %146 = call double @log(double noundef %145) #5
  %147 = fmul double %134, %146
  store double %147, ptr %11, align 8, !tbaa !15
  %148 = load ptr, ptr %6, align 8, !tbaa !5
  %149 = load i32, ptr %7, align 4, !tbaa !14
  %150 = zext i32 %149 to i64
  %151 = getelementptr inbounds double, ptr %148, i64 %150
  %152 = load double, ptr %151, align 8, !tbaa !15
  %153 = load ptr, ptr %6, align 8, !tbaa !5
  %154 = load i32, ptr %8, align 4, !tbaa !14
  %155 = zext i32 %154 to i64
  %156 = getelementptr inbounds double, ptr %153, i64 %155
  %157 = load double, ptr %156, align 8, !tbaa !15
  %158 = fadd double %152, %157
  %159 = load double, ptr %11, align 8, !tbaa !15
  %160 = fadd double %159, %158
  store double %160, ptr %11, align 8, !tbaa !15
  store i32 0, ptr %9, align 4, !tbaa !14
  br label %161

161:                                              ; preds = %210, %123
  %162 = load i32, ptr %9, align 4, !tbaa !14
  %163 = load ptr, ptr %2, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct._VlAIB, ptr %163, i32 0, i32 10
  %165 = load i32, ptr %164, align 4, !tbaa !17
  %166 = icmp ult i32 %162, %165
  br i1 %166, label %167, label %213

167:                                              ; preds = %161
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  %168 = load ptr, ptr %5, align 8, !tbaa !5
  %169 = load i32, ptr %7, align 4, !tbaa !14
  %170 = load ptr, ptr %2, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct._VlAIB, ptr %170, i32 0, i32 10
  %172 = load i32, ptr %171, align 4, !tbaa !17
  %173 = mul i32 %169, %172
  %174 = load i32, ptr %9, align 4, !tbaa !14
  %175 = add i32 %173, %174
  %176 = zext i32 %175 to i64
  %177 = getelementptr inbounds double, ptr %168, i64 %176
  %178 = load double, ptr %177, align 8, !tbaa !15
  store double %178, ptr %13, align 8, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  %179 = load ptr, ptr %5, align 8, !tbaa !5
  %180 = load i32, ptr %8, align 4, !tbaa !14
  %181 = load ptr, ptr %2, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct._VlAIB, ptr %181, i32 0, i32 10
  %183 = load i32, ptr %182, align 4, !tbaa !17
  %184 = mul i32 %180, %183
  %185 = load i32, ptr %9, align 4, !tbaa !14
  %186 = add i32 %184, %185
  %187 = zext i32 %186 to i64
  %188 = getelementptr inbounds double, ptr %179, i64 %187
  %189 = load double, ptr %188, align 8, !tbaa !15
  store double %189, ptr %14, align 8, !tbaa !15
  %190 = load double, ptr %13, align 8, !tbaa !15
  %191 = fcmp oeq double %190, 0.000000e+00
  br i1 %191, label %192, label %196

192:                                              ; preds = %167
  %193 = load double, ptr %14, align 8, !tbaa !15
  %194 = fcmp oeq double %193, 0.000000e+00
  br i1 %194, label %195, label %196

195:                                              ; preds = %192
  store i32 16, ptr %12, align 4
  br label %207

196:                                              ; preds = %192, %167
  %197 = load double, ptr %13, align 8, !tbaa !15
  %198 = load double, ptr %14, align 8, !tbaa !15
  %199 = fadd double %197, %198
  %200 = load double, ptr %13, align 8, !tbaa !15
  %201 = load double, ptr %14, align 8, !tbaa !15
  %202 = fadd double %200, %201
  %203 = call double @log(double noundef %202) #5
  %204 = load double, ptr %11, align 8, !tbaa !15
  %205 = fneg double %199
  %206 = call double @llvm.fmuladd.f64(double %205, double %203, double %204)
  store double %206, ptr %11, align 8, !tbaa !15
  store i32 0, ptr %12, align 4
  br label %207

207:                                              ; preds = %196, %195
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  %208 = load i32, ptr %12, align 4
  switch i32 %208, label %277 [
    i32 0, label %209
    i32 16, label %210
  ]

209:                                              ; preds = %207
  br label %210

210:                                              ; preds = %209, %207
  %211 = load i32, ptr %9, align 4, !tbaa !14
  %212 = add i32 %211, 1
  store i32 %212, ptr %9, align 4, !tbaa !14
  br label %161, !llvm.loop !23

213:                                              ; preds = %161
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %214 = load double, ptr %11, align 8, !tbaa !15
  store double %214, ptr %15, align 8, !tbaa !15
  %215 = load double, ptr %15, align 8, !tbaa !15
  %216 = load ptr, ptr %2, align 8, !tbaa !5
  %217 = getelementptr inbounds %struct._VlAIB, ptr %216, i32 0, i32 2
  %218 = load ptr, ptr %217, align 8, !tbaa !24
  %219 = load i32, ptr %7, align 4, !tbaa !14
  %220 = zext i32 %219 to i64
  %221 = getelementptr inbounds double, ptr %218, i64 %220
  %222 = load double, ptr %221, align 8, !tbaa !15
  %223 = fcmp olt double %215, %222
  br i1 %223, label %224, label %239

224:                                              ; preds = %213
  %225 = load double, ptr %15, align 8, !tbaa !15
  %226 = load ptr, ptr %2, align 8, !tbaa !5
  %227 = getelementptr inbounds %struct._VlAIB, ptr %226, i32 0, i32 2
  %228 = load ptr, ptr %227, align 8, !tbaa !24
  %229 = load i32, ptr %7, align 4, !tbaa !14
  %230 = zext i32 %229 to i64
  %231 = getelementptr inbounds double, ptr %228, i64 %230
  store double %225, ptr %231, align 8, !tbaa !15
  %232 = load i32, ptr %8, align 4, !tbaa !14
  %233 = load ptr, ptr %2, align 8, !tbaa !5
  %234 = getelementptr inbounds %struct._VlAIB, ptr %233, i32 0, i32 3
  %235 = load ptr, ptr %234, align 8, !tbaa !25
  %236 = load i32, ptr %7, align 4, !tbaa !14
  %237 = zext i32 %236 to i64
  %238 = getelementptr inbounds i32, ptr %235, i64 %237
  store i32 %232, ptr %238, align 4, !tbaa !14
  br label %239

239:                                              ; preds = %224, %213
  %240 = load double, ptr %15, align 8, !tbaa !15
  %241 = load ptr, ptr %2, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct._VlAIB, ptr %241, i32 0, i32 2
  %243 = load ptr, ptr %242, align 8, !tbaa !24
  %244 = load i32, ptr %8, align 4, !tbaa !14
  %245 = zext i32 %244 to i64
  %246 = getelementptr inbounds double, ptr %243, i64 %245
  %247 = load double, ptr %246, align 8, !tbaa !15
  %248 = fcmp olt double %240, %247
  br i1 %248, label %249, label %264

249:                                              ; preds = %239
  %250 = load double, ptr %15, align 8, !tbaa !15
  %251 = load ptr, ptr %2, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct._VlAIB, ptr %251, i32 0, i32 2
  %253 = load ptr, ptr %252, align 8, !tbaa !24
  %254 = load i32, ptr %8, align 4, !tbaa !14
  %255 = zext i32 %254 to i64
  %256 = getelementptr inbounds double, ptr %253, i64 %255
  store double %250, ptr %256, align 8, !tbaa !15
  %257 = load i32, ptr %7, align 4, !tbaa !14
  %258 = load ptr, ptr %2, align 8, !tbaa !5
  %259 = getelementptr inbounds %struct._VlAIB, ptr %258, i32 0, i32 3
  %260 = load ptr, ptr %259, align 8, !tbaa !25
  %261 = load i32, ptr %8, align 4, !tbaa !14
  %262 = zext i32 %261 to i64
  %263 = getelementptr inbounds i32, ptr %260, i64 %262
  store i32 %257, ptr %263, align 4, !tbaa !14
  br label %264

264:                                              ; preds = %249, %239
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  store i32 0, ptr %12, align 4
  br label %265

265:                                              ; preds = %264, %122
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  %266 = load i32, ptr %12, align 4
  switch i32 %266, label %277 [
    i32 0, label %267
    i32 13, label %268
  ]

267:                                              ; preds = %265
  br label %268

268:                                              ; preds = %267, %265
  %269 = load i32, ptr %8, align 4, !tbaa !14
  %270 = add i32 %269, 1
  store i32 %270, ptr %8, align 4, !tbaa !14
  br label %98, !llvm.loop !26

271:                                              ; preds = %98
  br label %272

272:                                              ; preds = %271
  %273 = load i32, ptr %3, align 4, !tbaa !14
  %274 = add i32 %273, 1
  store i32 %274, ptr %3, align 4, !tbaa !14
  br label %84, !llvm.loop !27

275:                                              ; preds = %84
  %276 = load ptr, ptr %6, align 8, !tbaa !5
  call void @vl_free(ptr noundef %276)
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #5
  call void @llvm.lifetime.end.p0(i64 8, 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

277:                                              ; preds = %265, %207
  unreachable
}

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

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

declare void @vl_free(ptr noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind "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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
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/C++ TBAA"}
!9 = !{!10, !6, i64 56}
!10 = !{!"_VlAIB", !6, i64 0, !11, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !11, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !11, i64 72, !11, i64 76, !6, i64 80, !6, i64 88, !11, i64 96}
!11 = !{!"int", !7, i64 0}
!12 = !{!10, !6, i64 48}
!13 = !{!10, !11, i64 8}
!14 = !{!11, !11, i64 0}
!15 = !{!16, !16, i64 0}
!16 = !{!"double", !7, i64 0}
!17 = !{!10, !11, i64 76}
!18 = distinct !{!18, !19}
!19 = !{!"llvm.loop.mustprogress"}
!20 = distinct !{!20, !19}
!21 = !{!10, !11, i64 40}
!22 = !{!10, !6, i64 32}
!23 = distinct !{!23, !19}
!24 = !{!10, !6, i64 16}
!25 = !{!10, !6, i64 24}
!26 = distinct !{!26, !19}
!27 = distinct !{!27, !19}


; 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"

declare ptr @vl_malloc(i64 noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
define dso_local void @vl_aib_update_beta(ptr nocapture noundef readonly %0) local_unnamed_addr #1 {
  %2 = getelementptr inbounds i8, ptr %0, i64 56
  %3 = load ptr, ptr %2, align 8, !tbaa !5
  %4 = getelementptr inbounds i8, ptr %0, i64 48
  %5 = load ptr, ptr %4, align 8, !tbaa !11
  %6 = getelementptr inbounds i8, ptr %0, i64 8
  %7 = load i32, ptr %6, align 8, !tbaa !12
  %8 = zext i32 %7 to i64
  %9 = shl nuw nsw i64 %8, 3
  %10 = tail call ptr @vl_malloc(i64 noundef %9) #5
  %11 = load i32, ptr %6, align 8, !tbaa !12
  %.not = icmp eq i32 %11, 0
  br i1 %.not, label %.preheader, label %.lr.ph101

.lr.ph101:                                        ; preds = %1
  %12 = getelementptr inbounds i8, ptr %0, i64 76
  %13 = load i32, ptr %12, align 4, !tbaa !13
  %.not115 = icmp eq i32 %13, 0
  br i1 %.not115, label %.preheader.thread, label %.lr.ph101.split

.preheader.loopexit122:                           ; preds = %._crit_edge
  %14 = icmp eq i32 %51, 0
  br label %.preheader

.preheader:                                       ; preds = %.preheader.loopexit122, %1
  %.not118 = phi i1 [ %14, %.preheader.loopexit122 ], [ true, %1 ]
  %15 = getelementptr inbounds i8, ptr %0, i64 40
  %16 = load i32, ptr %15, align 8, !tbaa !14
  %.not117 = icmp eq i32 %16, 0
  %brmerge = or i1 %.not117, %.not118
  br i1 %brmerge, label %._crit_edge114, label %.lr.ph113.split.preheader

.preheader.thread:                                ; preds = %.lr.ph101
  %umax = zext i32 %11 to i64
  %17 = shl nuw nsw i64 %umax, 3
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(1) %10, i8 0, i64 %17, i1 false), !tbaa !15
  %18 = getelementptr inbounds i8, ptr %0, i64 40
  %19 = load i32, ptr %18, align 8, !tbaa !14
  %.not117137 = icmp eq i32 %19, 0
  br i1 %.not117137, label %._crit_edge114, label %.lr.ph113.split.preheader

.lr.ph113.split.preheader:                        ; preds = %.preheader, %.preheader.thread
  %20 = phi ptr [ %18, %.preheader.thread ], [ %15, %.preheader ]
  %21 = phi i32 [ %19, %.preheader.thread ], [ %16, %.preheader ]
  %22 = getelementptr inbounds i8, ptr %0, i64 32
  %23 = getelementptr inbounds i8, ptr %0, i64 76
  %24 = getelementptr inbounds i8, ptr %0, i64 16
  %25 = getelementptr inbounds i8, ptr %0, i64 24
  br label %.lr.ph113.split

.lr.ph101.split:                                  ; preds = %.lr.ph101, %._crit_edge
  %26 = phi i32 [ %51, %._crit_edge ], [ %11, %.lr.ph101 ]
  %27 = phi i32 [ %52, %._crit_edge ], [ %13, %.lr.ph101 ]
  %28 = phi i32 [ %53, %._crit_edge ], [ %13, %.lr.ph101 ]
  %indvars.iv = phi i64 [ %indvars.iv.next, %._crit_edge ], [ 0, %.lr.ph101 ]
  %29 = getelementptr inbounds double, ptr %10, i64 %indvars.iv
  store double 0.000000e+00, ptr %29, align 8, !tbaa !15
  %.not116 = icmp eq i32 %28, 0
  br i1 %.not116, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph101.split
  %30 = getelementptr inbounds double, ptr %3, i64 %indvars.iv
  %31 = trunc nuw i64 %indvars.iv to i32
  br label %32

32:                                               ; preds = %.lr.ph, %47
  %33 = phi i32 [ %27, %.lr.ph ], [ %48, %47 ]
  %34 = phi i32 [ %28, %.lr.ph ], [ %48, %47 ]
  %.09098 = phi i32 [ 0, %.lr.ph ], [ %49, %47 ]
  %35 = mul i32 %34, %31
  %36 = add i32 %35, %.09098
  %37 = zext i32 %36 to i64
  %38 = getelementptr inbounds double, ptr %5, i64 %37
  %39 = load double, ptr %38, align 8, !tbaa !15
  %40 = fcmp une double %39, 0.000000e+00
  br i1 %40, label %41, label %47

41:                                               ; preds = %32
  %42 = load double, ptr %30, align 8, !tbaa !15
  %43 = fdiv double %39, %42
  %44 = tail call double @log(double noundef %43) #5
  %45 = load double, ptr %29, align 8, !tbaa !15
  %46 = tail call double @llvm.fmuladd.f64(double %39, double %44, double %45)
  store double %46, ptr %29, align 8, !tbaa !15
  %.pre = load i32, ptr %12, align 4, !tbaa !13
  br label %47

47:                                               ; preds = %41, %32
  %48 = phi i32 [ %.pre, %41 ], [ %33, %32 ]
  %49 = add nuw i32 %.09098, 1
  %50 = icmp ult i32 %49, %48
  br i1 %50, label %32, label %._crit_edge.loopexit, !llvm.loop !17

._crit_edge.loopexit:                             ; preds = %47
  %.pre133 = load i32, ptr %6, align 8, !tbaa !12
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %.lr.ph101.split
  %51 = phi i32 [ %.pre133, %._crit_edge.loopexit ], [ %26, %.lr.ph101.split ]
  %52 = phi i32 [ %48, %._crit_edge.loopexit ], [ %27, %.lr.ph101.split ]
  %53 = phi i32 [ %48, %._crit_edge.loopexit ], [ 0, %.lr.ph101.split ]
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %54 = zext i32 %51 to i64
  %55 = icmp ult i64 %indvars.iv.next, %54
  br i1 %55, label %.lr.ph101.split, label %.preheader.loopexit122, !llvm.loop !19

.lr.ph113.split:                                  ; preds = %.lr.ph113.split.preheader, %._crit_edge111
  %56 = phi i32 [ %21, %.lr.ph113.split.preheader ], [ %125, %._crit_edge111 ]
  %57 = phi i32 [ 1, %.lr.ph113.split.preheader ], [ %126, %._crit_edge111 ]
  %indvars.iv130 = phi i64 [ 0, %.lr.ph113.split.preheader ], [ %indvars.iv.next131, %._crit_edge111 ]
  %58 = load ptr, ptr %22, align 8, !tbaa !21
  %59 = getelementptr inbounds i32, ptr %58, i64 %indvars.iv130
  %60 = load i32, ptr %59, align 4, !tbaa !22
  %.not119 = icmp eq i32 %57, 0
  br i1 %.not119, label %._crit_edge111, label %.lr.ph110

.lr.ph110:                                        ; preds = %.lr.ph113.split
  %61 = zext i32 %60 to i64
  %62 = getelementptr inbounds double, ptr %3, i64 %61
  %63 = getelementptr inbounds double, ptr %10, i64 %61
  br label %64

64:                                               ; preds = %.lr.ph110, %121
  %indvars.iv127 = phi i64 [ 0, %.lr.ph110 ], [ %indvars.iv.next128, %121 ]
  %65 = icmp eq i64 %indvars.iv127, %61
  br i1 %65, label %121, label %66

66:                                               ; preds = %64
  %67 = load double, ptr %62, align 8, !tbaa !15
  %68 = fcmp oeq double %67, 0.000000e+00
  br i1 %68, label %121, label %69

69:                                               ; preds = %66
  %70 = getelementptr inbounds double, ptr %3, i64 %indvars.iv127
  %71 = load double, ptr %70, align 8, !tbaa !15
  %72 = fcmp oeq double %71, 0.000000e+00
  br i1 %72, label %121, label %73

73:                                               ; preds = %69
  %74 = fadd double %67, %71
  %75 = tail call double @log(double noundef %74) #5
  %76 = fmul double %74, %75
  %77 = load double, ptr %63, align 8, !tbaa !15
  %78 = getelementptr inbounds double, ptr %10, i64 %indvars.iv127
  %79 = load double, ptr %78, align 8, !tbaa !15
  %80 = fadd double %77, %79
  %81 = fadd double %76, %80
  %82 = load i32, ptr %23, align 4, !tbaa !13
  %.not120 = icmp eq i32 %82, 0
  br i1 %.not120, label %._crit_edge106, label %.lr.ph105.preheader

.lr.ph105.preheader:                              ; preds = %73
  %83 = trunc nuw i64 %indvars.iv127 to i32
  br label %.lr.ph105

.lr.ph105:                                        ; preds = %.lr.ph105.preheader, %102
  %84 = phi i32 [ %103, %102 ], [ %82, %.lr.ph105.preheader ]
  %.089103 = phi double [ %.1, %102 ], [ %81, %.lr.ph105.preheader ]
  %.191102 = phi i32 [ %104, %102 ], [ 0, %.lr.ph105.preheader ]
  %85 = mul i32 %84, %60
  %86 = add i32 %85, %.191102
  %87 = zext i32 %86 to i64
  %88 = getelementptr inbounds double, ptr %5, i64 %87
  %89 = load double, ptr %88, align 8, !tbaa !15
  %90 = mul i32 %84, %83
  %91 = add i32 %90, %.191102
  %92 = zext i32 %91 to i64
  %93 = getelementptr inbounds double, ptr %5, i64 %92
  %94 = load double, ptr %93, align 8, !tbaa !15
  %95 = fcmp oeq double %89, 0.000000e+00
  %96 = fcmp oeq double %94, 0.000000e+00
  %or.cond = select i1 %95, i1 %96, i1 false
  br i1 %or.cond, label %102, label %97

97:                                               ; preds = %.lr.ph105
  %98 = fadd double %89, %94
  %99 = tail call double @log(double noundef %98) #5
  %100 = fneg double %98
  %101 = tail call double @llvm.fmuladd.f64(double %100, double %99, double %.089103)
  %.pre134 = load i32, ptr %23, align 4, !tbaa !13
  br label %102

102:                                              ; preds = %.lr.ph105, %97
  %103 = phi i32 [ %.pre134, %97 ], [ %84, %.lr.ph105 ]
  %.1 = phi double [ %101, %97 ], [ %.089103, %.lr.ph105 ]
  %104 = add nuw i32 %.191102, 1
  %105 = icmp ult i32 %104, %103
  br i1 %105, label %.lr.ph105, label %._crit_edge106, !llvm.loop !23

._crit_edge106:                                   ; preds = %102, %73
  %.089.lcssa = phi double [ %81, %73 ], [ %.1, %102 ]
  %106 = load ptr, ptr %24, align 8, !tbaa !24
  %107 = getelementptr inbounds double, ptr %106, i64 %61
  %108 = load double, ptr %107, align 8, !tbaa !15
  %109 = fcmp olt double %.089.lcssa, %108
  br i1 %109, label %110, label %114

110:                                              ; preds = %._crit_edge106
  store double %.089.lcssa, ptr %107, align 8, !tbaa !15
  %111 = load ptr, ptr %25, align 8, !tbaa !25
  %112 = getelementptr inbounds i32, ptr %111, i64 %61
  %113 = trunc nuw i64 %indvars.iv127 to i32
  store i32 %113, ptr %112, align 4, !tbaa !22
  br label %114

114:                                              ; preds = %110, %._crit_edge106
  %115 = getelementptr inbounds double, ptr %106, i64 %indvars.iv127
  %116 = load double, ptr %115, align 8, !tbaa !15
  %117 = fcmp olt double %.089.lcssa, %116
  br i1 %117, label %118, label %121

118:                                              ; preds = %114
  store double %.089.lcssa, ptr %115, align 8, !tbaa !15
  %119 = load ptr, ptr %25, align 8, !tbaa !25
  %120 = getelementptr inbounds i32, ptr %119, i64 %indvars.iv127
  store i32 %60, ptr %120, align 4, !tbaa !22
  br label %121

121:                                              ; preds = %114, %118, %64, %66, %69
  %indvars.iv.next128 = add nuw nsw i64 %indvars.iv127, 1
  %122 = load i32, ptr %6, align 8, !tbaa !12
  %123 = zext i32 %122 to i64
  %124 = icmp ult i64 %indvars.iv.next128, %123
  br i1 %124, label %64, label %._crit_edge111.loopexit, !llvm.loop !26

._crit_edge111.loopexit:                          ; preds = %121
  %.pre135 = load i32, ptr %20, align 8, !tbaa !14
  br label %._crit_edge111

._crit_edge111:                                   ; preds = %._crit_edge111.loopexit, %.lr.ph113.split
  %125 = phi i32 [ %.pre135, %._crit_edge111.loopexit ], [ %56, %.lr.ph113.split ]
  %126 = phi i32 [ %122, %._crit_edge111.loopexit ], [ 0, %.lr.ph113.split ]
  %indvars.iv.next131 = add nuw nsw i64 %indvars.iv130, 1
  %127 = zext i32 %125 to i64
  %128 = icmp ult i64 %indvars.iv.next131, %127
  br i1 %128, label %.lr.ph113.split, label %._crit_edge114, !llvm.loop !27

._crit_edge114:                                   ; preds = %._crit_edge111, %.preheader, %.preheader.thread
  tail call void @vl_free(ptr noundef %10) #5
  ret void
}

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

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

declare void @vl_free(ptr noundef) local_unnamed_addr #0

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #4

attributes #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 = { 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 = { 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 nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { nocallback nofree nounwind willreturn memory(argmem: write) }
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, !7, i64 56}
!6 = !{!"_VlAIB", !7, i64 0, !10, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !10, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !10, i64 72, !10, i64 76, !7, i64 80, !7, i64 88, !10, i64 96}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!6, !7, i64 48}
!12 = !{!6, !10, i64 8}
!13 = !{!6, !10, i64 76}
!14 = !{!6, !10, i64 40}
!15 = !{!16, !16, i64 0}
!16 = !{!"double", !8, i64 0}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = distinct !{!19, !18, !20}
!20 = !{!"llvm.loop.unswitch.partial.disable"}
!21 = !{!6, !7, i64 32}
!22 = !{!10, !10, i64 0}
!23 = distinct !{!23, !18}
!24 = !{!6, !7, i64 16}
!25 = !{!6, !7, i64 24}
!26 = distinct !{!26, !18}
!27 = distinct !{!27, !18, !20}


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