; LLVM IR from DejayRezme/DeltaAutoCalibration :: src (lbfgs)

; 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.lbfgs_parameter_t = type { i32, double, i32, double, i32, i32, i32, double, double, double, double, double, double, double, i32, i32 }
%struct.tag_callback_data = type { i32, ptr, ptr, ptr }
%struct.tag_iteration_data = type { double, ptr, ptr, double }

@_defparam = external hidden constant %struct.lbfgs_parameter_t, align 8

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @vecalloc(i64 noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecfree(ptr noundef) #0

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @lbfgs(i32 noundef %0, ptr noundef %1, ptr noundef %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef %6) #2 {
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca double, align 8
  %24 = alloca %struct.lbfgs_parameter_t, align 8
  %25 = alloca i32, align 4
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca ptr, align 8
  %35 = alloca double, align 8
  %36 = alloca double, align 8
  %37 = alloca double, align 8
  %38 = alloca double, align 8
  %39 = alloca double, align 8
  %40 = alloca double, align 8
  %41 = alloca double, align 8
  %42 = alloca ptr, align 8
  %43 = alloca %struct.tag_callback_data, align 8
  %44 = alloca i32, align 4
  store i32 %0, ptr %9, align 4, !tbaa !5
  store ptr %1, ptr %10, align 8, !tbaa !9
  store ptr %2, ptr %11, align 8, !tbaa !9
  store ptr %3, ptr %12, align 8, !tbaa !9
  store ptr %4, ptr %13, align 8, !tbaa !9
  store ptr %5, ptr %14, align 8, !tbaa !9
  store ptr %6, ptr %15, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.start.p0(i64 112, ptr %24) #5
  %45 = load ptr, ptr %15, align 8, !tbaa !9
  %46 = icmp ne ptr %45, null
  br i1 %46, label %47, label %49

47:                                               ; preds = %7
  %48 = load ptr, ptr %15, align 8, !tbaa !9
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %24, ptr align 8 %48, i64 112, i1 false), !tbaa.struct !11
  br label %50

49:                                               ; preds = %7
  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %24, ptr align 8 @_defparam, i64 112, i1 false), !tbaa.struct !11
  br label %50

50:                                               ; preds = %49, %47
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #5
  %51 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 0
  %52 = load i32, ptr %51, align 8, !tbaa !14
  store i32 %52, ptr %25, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #5
  store ptr null, ptr %26, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  store ptr null, ptr %27, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  store ptr null, ptr %28, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  store ptr null, ptr %29, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #5
  store ptr null, ptr %30, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #5
  store ptr null, ptr %31, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #5
  store ptr null, ptr %32, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #5
  store ptr null, ptr %33, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #5
  store ptr null, ptr %34, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %35) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %37) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %38) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %40) #5
  store double 0.000000e+00, ptr %40, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #5
  store double 0.000000e+00, ptr %41, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #5
  store ptr @line_search_morethuente, ptr %42, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 32, ptr %43) #5
  %53 = load i32, ptr %9, align 4, !tbaa !5
  %54 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 0
  store i32 %53, ptr %54, align 8, !tbaa !16
  %55 = load ptr, ptr %14, align 8, !tbaa !9
  %56 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 1
  store ptr %55, ptr %56, align 8, !tbaa !18
  %57 = load ptr, ptr %12, align 8, !tbaa !9
  %58 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 2
  store ptr %57, ptr %58, align 8, !tbaa !19
  %59 = load ptr, ptr %13, align 8, !tbaa !9
  %60 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 3
  store ptr %59, ptr %60, align 8, !tbaa !20
  %61 = load i32, ptr %9, align 4, !tbaa !5
  %62 = icmp sle i32 %61, 0
  br i1 %62, label %63, label %64

63:                                               ; preds = %50
  store i32 -1020, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

64:                                               ; preds = %50
  %65 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 1
  %66 = load double, ptr %65, align 8, !tbaa !21
  %67 = fcmp olt double %66, 0.000000e+00
  br i1 %67, label %68, label %69

68:                                               ; preds = %64
  store i32 -1017, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

69:                                               ; preds = %64
  %70 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 2
  %71 = load i32, ptr %70, align 8, !tbaa !22
  %72 = icmp slt i32 %71, 0
  br i1 %72, label %73, label %74

73:                                               ; preds = %69
  store i32 -1016, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

74:                                               ; preds = %69
  %75 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 3
  %76 = load double, ptr %75, align 8, !tbaa !23
  %77 = fcmp olt double %76, 0.000000e+00
  br i1 %77, label %78, label %79

78:                                               ; preds = %74
  store i32 -1015, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

79:                                               ; preds = %74
  %80 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 7
  %81 = load double, ptr %80, align 8, !tbaa !24
  %82 = fcmp olt double %81, 0.000000e+00
  br i1 %82, label %83, label %84

83:                                               ; preds = %79
  store i32 -1013, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

84:                                               ; preds = %79
  %85 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 8
  %86 = load double, ptr %85, align 8, !tbaa !25
  %87 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 7
  %88 = load double, ptr %87, align 8, !tbaa !24
  %89 = fcmp olt double %86, %88
  br i1 %89, label %90, label %91

90:                                               ; preds = %84
  store i32 -1012, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

91:                                               ; preds = %84
  %92 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 9
  %93 = load double, ptr %92, align 8, !tbaa !26
  %94 = fcmp olt double %93, 0.000000e+00
  br i1 %94, label %95, label %96

95:                                               ; preds = %91
  store i32 -1011, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

96:                                               ; preds = %91
  %97 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 5
  %98 = load i32, ptr %97, align 4, !tbaa !27
  %99 = icmp eq i32 %98, 2
  br i1 %99, label %104, label %100

100:                                              ; preds = %96
  %101 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 5
  %102 = load i32, ptr %101, align 4, !tbaa !27
  %103 = icmp eq i32 %102, 3
  br i1 %103, label %104, label %116

104:                                              ; preds = %100, %96
  %105 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 10
  %106 = load double, ptr %105, align 8, !tbaa !28
  %107 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 9
  %108 = load double, ptr %107, align 8, !tbaa !26
  %109 = fcmp ole double %106, %108
  br i1 %109, label %114, label %110

110:                                              ; preds = %104
  %111 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 10
  %112 = load double, ptr %111, align 8, !tbaa !28
  %113 = fcmp ole double 1.000000e+00, %112
  br i1 %113, label %114, label %115

114:                                              ; preds = %110, %104
  store i32 -1010, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

115:                                              ; preds = %110
  br label %116

116:                                              ; preds = %115, %100
  %117 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 11
  %118 = load double, ptr %117, align 8, !tbaa !29
  %119 = fcmp olt double %118, 0.000000e+00
  br i1 %119, label %120, label %121

120:                                              ; preds = %116
  store i32 -1009, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

121:                                              ; preds = %116
  %122 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 12
  %123 = load double, ptr %122, align 8, !tbaa !30
  %124 = fcmp olt double %123, 0.000000e+00
  br i1 %124, label %125, label %126

125:                                              ; preds = %121
  store i32 -1008, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

126:                                              ; preds = %121
  %127 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 6
  %128 = load i32, ptr %127, align 8, !tbaa !31
  %129 = icmp sle i32 %128, 0
  br i1 %129, label %130, label %131

130:                                              ; preds = %126
  store i32 -1007, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

131:                                              ; preds = %126
  %132 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %133 = load double, ptr %132, align 8, !tbaa !32
  %134 = fcmp olt double %133, 0.000000e+00
  br i1 %134, label %135, label %136

135:                                              ; preds = %131
  store i32 -1006, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

136:                                              ; preds = %131
  %137 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 14
  %138 = load i32, ptr %137, align 8, !tbaa !33
  %139 = icmp slt i32 %138, 0
  br i1 %139, label %145, label %140

140:                                              ; preds = %136
  %141 = load i32, ptr %9, align 4, !tbaa !5
  %142 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 14
  %143 = load i32, ptr %142, align 8, !tbaa !33
  %144 = icmp slt i32 %141, %143
  br i1 %144, label %145, label %146

145:                                              ; preds = %140, %136
  store i32 -1005, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

146:                                              ; preds = %140
  %147 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 15
  %148 = load i32, ptr %147, align 4, !tbaa !34
  %149 = icmp slt i32 %148, 0
  br i1 %149, label %150, label %153

150:                                              ; preds = %146
  %151 = load i32, ptr %9, align 4, !tbaa !5
  %152 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 15
  store i32 %151, ptr %152, align 4, !tbaa !34
  br label %153

153:                                              ; preds = %150, %146
  %154 = load i32, ptr %9, align 4, !tbaa !5
  %155 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 15
  %156 = load i32, ptr %155, align 4, !tbaa !34
  %157 = icmp slt i32 %154, %156
  br i1 %157, label %158, label %159

158:                                              ; preds = %153
  store i32 -1004, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

159:                                              ; preds = %153
  %160 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %161 = load double, ptr %160, align 8, !tbaa !32
  %162 = fcmp une double %161, 0.000000e+00
  br i1 %162, label %163, label %169

163:                                              ; preds = %159
  %164 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 5
  %165 = load i32, ptr %164, align 4, !tbaa !27
  switch i32 %165, label %167 [
    i32 2, label %166
  ]

166:                                              ; preds = %163
  store ptr @line_search_backtracking_owlqn, ptr %42, align 8, !tbaa !9
  br label %168

167:                                              ; preds = %163
  store i32 -1014, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

168:                                              ; preds = %166
  br label %176

169:                                              ; preds = %159
  %170 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 5
  %171 = load i32, ptr %170, align 4, !tbaa !27
  switch i32 %171, label %174 [
    i32 0, label %172
    i32 1, label %173
    i32 2, label %173
    i32 3, label %173
  ]

172:                                              ; preds = %169
  store ptr @line_search_morethuente, ptr %42, align 8, !tbaa !9
  br label %175

173:                                              ; preds = %169, %169, %169
  store ptr @line_search_backtracking, ptr %42, align 8, !tbaa !9
  br label %175

174:                                              ; preds = %169
  store i32 -1014, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

175:                                              ; preds = %173, %172
  br label %176

176:                                              ; preds = %175, %168
  %177 = load i32, ptr %9, align 4, !tbaa !5
  %178 = sext i32 %177 to i64
  %179 = mul i64 %178, 8
  %180 = call ptr @vecalloc(i64 noundef %179)
  store ptr %180, ptr %26, align 8, !tbaa !9
  %181 = load i32, ptr %9, align 4, !tbaa !5
  %182 = sext i32 %181 to i64
  %183 = mul i64 %182, 8
  %184 = call ptr @vecalloc(i64 noundef %183)
  store ptr %184, ptr %27, align 8, !tbaa !9
  %185 = load i32, ptr %9, align 4, !tbaa !5
  %186 = sext i32 %185 to i64
  %187 = mul i64 %186, 8
  %188 = call ptr @vecalloc(i64 noundef %187)
  store ptr %188, ptr %28, align 8, !tbaa !9
  %189 = load i32, ptr %9, align 4, !tbaa !5
  %190 = sext i32 %189 to i64
  %191 = mul i64 %190, 8
  %192 = call ptr @vecalloc(i64 noundef %191)
  store ptr %192, ptr %30, align 8, !tbaa !9
  %193 = load i32, ptr %9, align 4, !tbaa !5
  %194 = sext i32 %193 to i64
  %195 = mul i64 %194, 8
  %196 = call ptr @vecalloc(i64 noundef %195)
  store ptr %196, ptr %31, align 8, !tbaa !9
  %197 = load ptr, ptr %26, align 8, !tbaa !9
  %198 = icmp eq ptr %197, null
  br i1 %198, label %211, label %199

199:                                              ; preds = %176
  %200 = load ptr, ptr %27, align 8, !tbaa !9
  %201 = icmp eq ptr %200, null
  br i1 %201, label %211, label %202

202:                                              ; preds = %199
  %203 = load ptr, ptr %28, align 8, !tbaa !9
  %204 = icmp eq ptr %203, null
  br i1 %204, label %211, label %205

205:                                              ; preds = %202
  %206 = load ptr, ptr %30, align 8, !tbaa !9
  %207 = icmp eq ptr %206, null
  br i1 %207, label %211, label %208

208:                                              ; preds = %205
  %209 = load ptr, ptr %31, align 8, !tbaa !9
  %210 = icmp eq ptr %209, null
  br i1 %210, label %211, label %212

211:                                              ; preds = %208, %205, %202, %199, %176
  store i32 -1022, ptr %16, align 4, !tbaa !5
  br label %691

212:                                              ; preds = %208
  %213 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %214 = load double, ptr %213, align 8, !tbaa !32
  %215 = fcmp une double %214, 0.000000e+00
  br i1 %215, label %216, label %225

216:                                              ; preds = %212
  %217 = load i32, ptr %9, align 4, !tbaa !5
  %218 = sext i32 %217 to i64
  %219 = mul i64 %218, 8
  %220 = call ptr @vecalloc(i64 noundef %219)
  store ptr %220, ptr %29, align 8, !tbaa !9
  %221 = load ptr, ptr %29, align 8, !tbaa !9
  %222 = icmp eq ptr %221, null
  br i1 %222, label %223, label %224

223:                                              ; preds = %216
  store i32 -1022, ptr %16, align 4, !tbaa !5
  br label %691

224:                                              ; preds = %216
  br label %225

225:                                              ; preds = %224, %212
  %226 = load i32, ptr %25, align 4, !tbaa !5
  %227 = sext i32 %226 to i64
  %228 = mul i64 %227, 32
  %229 = call ptr @vecalloc(i64 noundef %228)
  store ptr %229, ptr %33, align 8, !tbaa !9
  %230 = load ptr, ptr %33, align 8, !tbaa !9
  %231 = icmp eq ptr %230, null
  br i1 %231, label %232, label %233

232:                                              ; preds = %225
  store i32 -1022, ptr %16, align 4, !tbaa !5
  br label %691

233:                                              ; preds = %225
  store i32 0, ptr %17, align 4, !tbaa !5
  br label %234

234:                                              ; preds = %270, %233
  %235 = load i32, ptr %17, align 4, !tbaa !5
  %236 = load i32, ptr %25, align 4, !tbaa !5
  %237 = icmp slt i32 %235, %236
  br i1 %237, label %238, label %273

238:                                              ; preds = %234
  %239 = load ptr, ptr %33, align 8, !tbaa !9
  %240 = load i32, ptr %17, align 4, !tbaa !5
  %241 = sext i32 %240 to i64
  %242 = getelementptr inbounds %struct.tag_iteration_data, ptr %239, i64 %241
  store ptr %242, ptr %34, align 8, !tbaa !9
  %243 = load ptr, ptr %34, align 8, !tbaa !9
  %244 = getelementptr inbounds %struct.tag_iteration_data, ptr %243, i32 0, i32 0
  store double 0.000000e+00, ptr %244, align 8, !tbaa !35
  %245 = load ptr, ptr %34, align 8, !tbaa !9
  %246 = getelementptr inbounds %struct.tag_iteration_data, ptr %245, i32 0, i32 3
  store double 0.000000e+00, ptr %246, align 8, !tbaa !37
  %247 = load i32, ptr %9, align 4, !tbaa !5
  %248 = sext i32 %247 to i64
  %249 = mul i64 %248, 8
  %250 = call ptr @vecalloc(i64 noundef %249)
  %251 = load ptr, ptr %34, align 8, !tbaa !9
  %252 = getelementptr inbounds %struct.tag_iteration_data, ptr %251, i32 0, i32 1
  store ptr %250, ptr %252, align 8, !tbaa !38
  %253 = load i32, ptr %9, align 4, !tbaa !5
  %254 = sext i32 %253 to i64
  %255 = mul i64 %254, 8
  %256 = call ptr @vecalloc(i64 noundef %255)
  %257 = load ptr, ptr %34, align 8, !tbaa !9
  %258 = getelementptr inbounds %struct.tag_iteration_data, ptr %257, i32 0, i32 2
  store ptr %256, ptr %258, align 8, !tbaa !39
  %259 = load ptr, ptr %34, align 8, !tbaa !9
  %260 = getelementptr inbounds %struct.tag_iteration_data, ptr %259, i32 0, i32 1
  %261 = load ptr, ptr %260, align 8, !tbaa !38
  %262 = icmp eq ptr %261, null
  br i1 %262, label %268, label %263

263:                                              ; preds = %238
  %264 = load ptr, ptr %34, align 8, !tbaa !9
  %265 = getelementptr inbounds %struct.tag_iteration_data, ptr %264, i32 0, i32 2
  %266 = load ptr, ptr %265, align 8, !tbaa !39
  %267 = icmp eq ptr %266, null
  br i1 %267, label %268, label %269

268:                                              ; preds = %263, %238
  store i32 -1022, ptr %16, align 4, !tbaa !5
  br label %691

269:                                              ; preds = %263
  br label %270

270:                                              ; preds = %269
  %271 = load i32, ptr %17, align 4, !tbaa !5
  %272 = add nsw i32 %271, 1
  store i32 %272, ptr %17, align 4, !tbaa !5
  br label %234, !llvm.loop !40

273:                                              ; preds = %234
  %274 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 2
  %275 = load i32, ptr %274, align 8, !tbaa !22
  %276 = icmp slt i32 0, %275
  br i1 %276, label %277, label %283

277:                                              ; preds = %273
  %278 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 2
  %279 = load i32, ptr %278, align 8, !tbaa !22
  %280 = sext i32 %279 to i64
  %281 = mul i64 %280, 8
  %282 = call ptr @vecalloc(i64 noundef %281)
  store ptr %282, ptr %32, align 8, !tbaa !9
  br label %283

283:                                              ; preds = %277, %273
  %284 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 2
  %285 = load ptr, ptr %284, align 8, !tbaa !19
  %286 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 1
  %287 = load ptr, ptr %286, align 8, !tbaa !18
  %288 = load ptr, ptr %10, align 8, !tbaa !9
  %289 = load ptr, ptr %27, align 8, !tbaa !9
  %290 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 0
  %291 = load i32, ptr %290, align 8, !tbaa !16
  %292 = call double %285(ptr noundef %287, ptr noundef %288, ptr noundef %289, i32 noundef %291, double noundef 0.000000e+00)
  store double %292, ptr %40, align 8, !tbaa !12
  %293 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %294 = load double, ptr %293, align 8, !tbaa !32
  %295 = fcmp une double 0.000000e+00, %294
  br i1 %295, label %296, label %318

296:                                              ; preds = %283
  %297 = load ptr, ptr %10, align 8, !tbaa !9
  %298 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 14
  %299 = load i32, ptr %298, align 8, !tbaa !33
  %300 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 15
  %301 = load i32, ptr %300, align 4, !tbaa !34
  %302 = call double @owlqn_x1norm(ptr noundef %297, i32 noundef %299, i32 noundef %301)
  store double %302, ptr %37, align 8, !tbaa !12
  %303 = load double, ptr %37, align 8, !tbaa !12
  %304 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %305 = load double, ptr %304, align 8, !tbaa !32
  %306 = load double, ptr %40, align 8, !tbaa !12
  %307 = call double @llvm.fmuladd.f64(double %303, double %305, double %306)
  store double %307, ptr %40, align 8, !tbaa !12
  %308 = load ptr, ptr %29, align 8, !tbaa !9
  %309 = load ptr, ptr %10, align 8, !tbaa !9
  %310 = load ptr, ptr %27, align 8, !tbaa !9
  %311 = load i32, ptr %9, align 4, !tbaa !5
  %312 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %313 = load double, ptr %312, align 8, !tbaa !32
  %314 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 14
  %315 = load i32, ptr %314, align 8, !tbaa !33
  %316 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 15
  %317 = load i32, ptr %316, align 4, !tbaa !34
  call void @owlqn_pseudo_gradient(ptr noundef %308, ptr noundef %309, ptr noundef %310, i32 noundef %311, double noundef %313, i32 noundef %315, i32 noundef %317)
  br label %318

318:                                              ; preds = %296, %283
  %319 = load ptr, ptr %32, align 8, !tbaa !9
  %320 = icmp ne ptr %319, null
  br i1 %320, label %321, label %325

321:                                              ; preds = %318
  %322 = load double, ptr %40, align 8, !tbaa !12
  %323 = load ptr, ptr %32, align 8, !tbaa !9
  %324 = getelementptr inbounds double, ptr %323, i64 0
  store double %322, ptr %324, align 8, !tbaa !12
  br label %325

325:                                              ; preds = %321, %318
  %326 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %327 = load double, ptr %326, align 8, !tbaa !32
  %328 = fcmp oeq double %327, 0.000000e+00
  br i1 %328, label %329, label %333

329:                                              ; preds = %325
  %330 = load ptr, ptr %30, align 8, !tbaa !9
  %331 = load ptr, ptr %27, align 8, !tbaa !9
  %332 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecncpy(ptr noundef %330, ptr noundef %331, i32 noundef %332)
  br label %337

333:                                              ; preds = %325
  %334 = load ptr, ptr %30, align 8, !tbaa !9
  %335 = load ptr, ptr %29, align 8, !tbaa !9
  %336 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecncpy(ptr noundef %334, ptr noundef %335, i32 noundef %336)
  br label %337

337:                                              ; preds = %333, %329
  %338 = load ptr, ptr %10, align 8, !tbaa !9
  %339 = load i32, ptr %9, align 4, !tbaa !5
  call void @vec2norm(ptr noundef %37, ptr noundef %338, i32 noundef %339)
  %340 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %341 = load double, ptr %340, align 8, !tbaa !32
  %342 = fcmp oeq double %341, 0.000000e+00
  br i1 %342, label %343, label %346

343:                                              ; preds = %337
  %344 = load ptr, ptr %27, align 8, !tbaa !9
  %345 = load i32, ptr %9, align 4, !tbaa !5
  call void @vec2norm(ptr noundef %38, ptr noundef %344, i32 noundef %345)
  br label %349

346:                                              ; preds = %337
  %347 = load ptr, ptr %29, align 8, !tbaa !9
  %348 = load i32, ptr %9, align 4, !tbaa !5
  call void @vec2norm(ptr noundef %38, ptr noundef %347, i32 noundef %348)
  br label %349

349:                                              ; preds = %346, %343
  %350 = load double, ptr %37, align 8, !tbaa !12
  %351 = fcmp olt double %350, 1.000000e+00
  br i1 %351, label %352, label %353

352:                                              ; preds = %349
  store double 1.000000e+00, ptr %37, align 8, !tbaa !12
  br label %353

353:                                              ; preds = %352, %349
  %354 = load double, ptr %38, align 8, !tbaa !12
  %355 = load double, ptr %37, align 8, !tbaa !12
  %356 = fdiv double %354, %355
  %357 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 1
  %358 = load double, ptr %357, align 8, !tbaa !21
  %359 = fcmp ole double %356, %358
  br i1 %359, label %360, label %361

360:                                              ; preds = %353
  store i32 2, ptr %16, align 4, !tbaa !5
  br label %691

361:                                              ; preds = %353
  %362 = load ptr, ptr %30, align 8, !tbaa !9
  %363 = load i32, ptr %9, align 4, !tbaa !5
  call void @vec2norminv(ptr noundef %23, ptr noundef %362, i32 noundef %363)
  store i32 1, ptr %19, align 4, !tbaa !5
  store i32 0, ptr %21, align 4, !tbaa !5
  br label %364

364:                                              ; preds = %689, %361
  %365 = load ptr, ptr %26, align 8, !tbaa !9
  %366 = load ptr, ptr %10, align 8, !tbaa !9
  %367 = load i32, ptr %9, align 4, !tbaa !5
  call void @veccpy(ptr noundef %365, ptr noundef %366, i32 noundef %367)
  %368 = load ptr, ptr %28, align 8, !tbaa !9
  %369 = load ptr, ptr %27, align 8, !tbaa !9
  %370 = load i32, ptr %9, align 4, !tbaa !5
  call void @veccpy(ptr noundef %368, ptr noundef %369, i32 noundef %370)
  %371 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %372 = load double, ptr %371, align 8, !tbaa !32
  %373 = fcmp oeq double %372, 0.000000e+00
  br i1 %373, label %374, label %384

374:                                              ; preds = %364
  %375 = load ptr, ptr %42, align 8, !tbaa !9
  %376 = load i32, ptr %9, align 4, !tbaa !5
  %377 = load ptr, ptr %10, align 8, !tbaa !9
  %378 = load ptr, ptr %27, align 8, !tbaa !9
  %379 = load ptr, ptr %30, align 8, !tbaa !9
  %380 = load ptr, ptr %26, align 8, !tbaa !9
  %381 = load ptr, ptr %28, align 8, !tbaa !9
  %382 = load ptr, ptr %31, align 8, !tbaa !9
  %383 = call i32 %375(i32 noundef %376, ptr noundef %377, ptr noundef %40, ptr noundef %378, ptr noundef %379, ptr noundef %23, ptr noundef %380, ptr noundef %381, ptr noundef %382, ptr noundef %43, ptr noundef %24)
  store i32 %383, ptr %20, align 4, !tbaa !5
  br label %404

384:                                              ; preds = %364
  %385 = load ptr, ptr %42, align 8, !tbaa !9
  %386 = load i32, ptr %9, align 4, !tbaa !5
  %387 = load ptr, ptr %10, align 8, !tbaa !9
  %388 = load ptr, ptr %27, align 8, !tbaa !9
  %389 = load ptr, ptr %30, align 8, !tbaa !9
  %390 = load ptr, ptr %26, align 8, !tbaa !9
  %391 = load ptr, ptr %29, align 8, !tbaa !9
  %392 = load ptr, ptr %31, align 8, !tbaa !9
  %393 = call i32 %385(i32 noundef %386, ptr noundef %387, ptr noundef %40, ptr noundef %388, ptr noundef %389, ptr noundef %23, ptr noundef %390, ptr noundef %391, ptr noundef %392, ptr noundef %43, ptr noundef %24)
  store i32 %393, ptr %20, align 4, !tbaa !5
  %394 = load ptr, ptr %29, align 8, !tbaa !9
  %395 = load ptr, ptr %10, align 8, !tbaa !9
  %396 = load ptr, ptr %27, align 8, !tbaa !9
  %397 = load i32, ptr %9, align 4, !tbaa !5
  %398 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %399 = load double, ptr %398, align 8, !tbaa !32
  %400 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 14
  %401 = load i32, ptr %400, align 8, !tbaa !33
  %402 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 15
  %403 = load i32, ptr %402, align 4, !tbaa !34
  call void @owlqn_pseudo_gradient(ptr noundef %394, ptr noundef %395, ptr noundef %396, i32 noundef %397, double noundef %399, i32 noundef %401, i32 noundef %403)
  br label %404

404:                                              ; preds = %384, %374
  %405 = load i32, ptr %20, align 4, !tbaa !5
  %406 = icmp slt i32 %405, 0
  br i1 %406, label %407, label %415

407:                                              ; preds = %404
  %408 = load ptr, ptr %10, align 8, !tbaa !9
  %409 = load ptr, ptr %26, align 8, !tbaa !9
  %410 = load i32, ptr %9, align 4, !tbaa !5
  call void @veccpy(ptr noundef %408, ptr noundef %409, i32 noundef %410)
  %411 = load ptr, ptr %27, align 8, !tbaa !9
  %412 = load ptr, ptr %28, align 8, !tbaa !9
  %413 = load i32, ptr %9, align 4, !tbaa !5
  call void @veccpy(ptr noundef %411, ptr noundef %412, i32 noundef %413)
  %414 = load i32, ptr %20, align 4, !tbaa !5
  store i32 %414, ptr %16, align 4, !tbaa !5
  br label %691

415:                                              ; preds = %404
  %416 = load ptr, ptr %10, align 8, !tbaa !9
  %417 = load i32, ptr %9, align 4, !tbaa !5
  call void @vec2norm(ptr noundef %37, ptr noundef %416, i32 noundef %417)
  %418 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %419 = load double, ptr %418, align 8, !tbaa !32
  %420 = fcmp oeq double %419, 0.000000e+00
  br i1 %420, label %421, label %424

421:                                              ; preds = %415
  %422 = load ptr, ptr %27, align 8, !tbaa !9
  %423 = load i32, ptr %9, align 4, !tbaa !5
  call void @vec2norm(ptr noundef %38, ptr noundef %422, i32 noundef %423)
  br label %427

424:                                              ; preds = %415
  %425 = load ptr, ptr %29, align 8, !tbaa !9
  %426 = load i32, ptr %9, align 4, !tbaa !5
  call void @vec2norm(ptr noundef %38, ptr noundef %425, i32 noundef %426)
  br label %427

427:                                              ; preds = %424, %421
  %428 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 3
  %429 = load ptr, ptr %428, align 8, !tbaa !20
  %430 = icmp ne ptr %429, null
  br i1 %430, label %431, label %450

431:                                              ; preds = %427
  %432 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 3
  %433 = load ptr, ptr %432, align 8, !tbaa !20
  %434 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 1
  %435 = load ptr, ptr %434, align 8, !tbaa !18
  %436 = load ptr, ptr %10, align 8, !tbaa !9
  %437 = load ptr, ptr %27, align 8, !tbaa !9
  %438 = load double, ptr %40, align 8, !tbaa !12
  %439 = load double, ptr %37, align 8, !tbaa !12
  %440 = load double, ptr %38, align 8, !tbaa !12
  %441 = load double, ptr %23, align 8, !tbaa !12
  %442 = getelementptr inbounds %struct.tag_callback_data, ptr %43, i32 0, i32 0
  %443 = load i32, ptr %442, align 8, !tbaa !16
  %444 = load i32, ptr %19, align 4, !tbaa !5
  %445 = load i32, ptr %20, align 4, !tbaa !5
  %446 = call i32 %433(ptr noundef %435, ptr noundef %436, ptr noundef %437, double noundef %438, double noundef %439, double noundef %440, double noundef %441, i32 noundef %443, i32 noundef %444, i32 noundef %445)
  store i32 %446, ptr %16, align 4, !tbaa !5
  %447 = icmp ne i32 %446, 0
  br i1 %447, label %448, label %449

448:                                              ; preds = %431
  br label %691

449:                                              ; preds = %431
  br label %450

450:                                              ; preds = %449, %427
  %451 = load double, ptr %37, align 8, !tbaa !12
  %452 = fcmp olt double %451, 1.000000e+00
  br i1 %452, label %453, label %454

453:                                              ; preds = %450
  store double 1.000000e+00, ptr %37, align 8, !tbaa !12
  br label %454

454:                                              ; preds = %453, %450
  %455 = load double, ptr %38, align 8, !tbaa !12
  %456 = load double, ptr %37, align 8, !tbaa !12
  %457 = fdiv double %455, %456
  %458 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 1
  %459 = load double, ptr %458, align 8, !tbaa !21
  %460 = fcmp ole double %457, %459
  br i1 %460, label %461, label %462

461:                                              ; preds = %454
  store i32 0, ptr %16, align 4, !tbaa !5
  br label %690

462:                                              ; preds = %454
  %463 = load ptr, ptr %32, align 8, !tbaa !9
  %464 = icmp ne ptr %463, null
  br i1 %464, label %465, label %498

465:                                              ; preds = %462
  %466 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 2
  %467 = load i32, ptr %466, align 8, !tbaa !22
  %468 = load i32, ptr %19, align 4, !tbaa !5
  %469 = icmp sle i32 %467, %468
  br i1 %469, label %470, label %489

470:                                              ; preds = %465
  %471 = load ptr, ptr %32, align 8, !tbaa !9
  %472 = load i32, ptr %19, align 4, !tbaa !5
  %473 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 2
  %474 = load i32, ptr %473, align 8, !tbaa !22
  %475 = srem i32 %472, %474
  %476 = sext i32 %475 to i64
  %477 = getelementptr inbounds double, ptr %471, i64 %476
  %478 = load double, ptr %477, align 8, !tbaa !12
  %479 = load double, ptr %40, align 8, !tbaa !12
  %480 = fsub double %478, %479
  %481 = load double, ptr %40, align 8, !tbaa !12
  %482 = fdiv double %480, %481
  store double %482, ptr %41, align 8, !tbaa !12
  %483 = load double, ptr %41, align 8, !tbaa !12
  %484 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 3
  %485 = load double, ptr %484, align 8, !tbaa !23
  %486 = fcmp olt double %483, %485
  br i1 %486, label %487, label %488

487:                                              ; preds = %470
  store i32 1, ptr %16, align 4, !tbaa !5
  br label %690

488:                                              ; preds = %470
  br label %489

489:                                              ; preds = %488, %465
  %490 = load double, ptr %40, align 8, !tbaa !12
  %491 = load ptr, ptr %32, align 8, !tbaa !9
  %492 = load i32, ptr %19, align 4, !tbaa !5
  %493 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 2
  %494 = load i32, ptr %493, align 8, !tbaa !22
  %495 = srem i32 %492, %494
  %496 = sext i32 %495 to i64
  %497 = getelementptr inbounds double, ptr %491, i64 %496
  store double %490, ptr %497, align 8, !tbaa !12
  br label %498

498:                                              ; preds = %489, %462
  %499 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 4
  %500 = load i32, ptr %499, align 8, !tbaa !42
  %501 = icmp ne i32 %500, 0
  br i1 %501, label %502, label %509

502:                                              ; preds = %498
  %503 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 4
  %504 = load i32, ptr %503, align 8, !tbaa !42
  %505 = load i32, ptr %19, align 4, !tbaa !5
  %506 = add nsw i32 %505, 1
  %507 = icmp slt i32 %504, %506
  br i1 %507, label %508, label %509

508:                                              ; preds = %502
  store i32 -997, ptr %16, align 4, !tbaa !5
  br label %690

509:                                              ; preds = %502, %498
  %510 = load ptr, ptr %33, align 8, !tbaa !9
  %511 = load i32, ptr %21, align 4, !tbaa !5
  %512 = sext i32 %511 to i64
  %513 = getelementptr inbounds %struct.tag_iteration_data, ptr %510, i64 %512
  store ptr %513, ptr %34, align 8, !tbaa !9
  %514 = load ptr, ptr %34, align 8, !tbaa !9
  %515 = getelementptr inbounds %struct.tag_iteration_data, ptr %514, i32 0, i32 1
  %516 = load ptr, ptr %515, align 8, !tbaa !38
  %517 = load ptr, ptr %10, align 8, !tbaa !9
  %518 = load ptr, ptr %26, align 8, !tbaa !9
  %519 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecdiff(ptr noundef %516, ptr noundef %517, ptr noundef %518, i32 noundef %519)
  %520 = load ptr, ptr %34, align 8, !tbaa !9
  %521 = getelementptr inbounds %struct.tag_iteration_data, ptr %520, i32 0, i32 2
  %522 = load ptr, ptr %521, align 8, !tbaa !39
  %523 = load ptr, ptr %27, align 8, !tbaa !9
  %524 = load ptr, ptr %28, align 8, !tbaa !9
  %525 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecdiff(ptr noundef %522, ptr noundef %523, ptr noundef %524, i32 noundef %525)
  %526 = load ptr, ptr %34, align 8, !tbaa !9
  %527 = getelementptr inbounds %struct.tag_iteration_data, ptr %526, i32 0, i32 2
  %528 = load ptr, ptr %527, align 8, !tbaa !39
  %529 = load ptr, ptr %34, align 8, !tbaa !9
  %530 = getelementptr inbounds %struct.tag_iteration_data, ptr %529, i32 0, i32 1
  %531 = load ptr, ptr %530, align 8, !tbaa !38
  %532 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecdot(ptr noundef %35, ptr noundef %528, ptr noundef %531, i32 noundef %532)
  %533 = load ptr, ptr %34, align 8, !tbaa !9
  %534 = getelementptr inbounds %struct.tag_iteration_data, ptr %533, i32 0, i32 2
  %535 = load ptr, ptr %534, align 8, !tbaa !39
  %536 = load ptr, ptr %34, align 8, !tbaa !9
  %537 = getelementptr inbounds %struct.tag_iteration_data, ptr %536, i32 0, i32 2
  %538 = load ptr, ptr %537, align 8, !tbaa !39
  %539 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecdot(ptr noundef %36, ptr noundef %535, ptr noundef %538, i32 noundef %539)
  %540 = load double, ptr %35, align 8, !tbaa !12
  %541 = load ptr, ptr %34, align 8, !tbaa !9
  %542 = getelementptr inbounds %struct.tag_iteration_data, ptr %541, i32 0, i32 3
  store double %540, ptr %542, align 8, !tbaa !37
  %543 = load i32, ptr %25, align 4, !tbaa !5
  %544 = load i32, ptr %19, align 4, !tbaa !5
  %545 = icmp sle i32 %543, %544
  br i1 %545, label %546, label %548

546:                                              ; preds = %509
  %547 = load i32, ptr %25, align 4, !tbaa !5
  br label %550

548:                                              ; preds = %509
  %549 = load i32, ptr %19, align 4, !tbaa !5
  br label %550

550:                                              ; preds = %548, %546
  %551 = phi i32 [ %547, %546 ], [ %549, %548 ]
  store i32 %551, ptr %22, align 4, !tbaa !5
  %552 = load i32, ptr %19, align 4, !tbaa !5
  %553 = add nsw i32 %552, 1
  store i32 %553, ptr %19, align 4, !tbaa !5
  %554 = load i32, ptr %21, align 4, !tbaa !5
  %555 = add nsw i32 %554, 1
  %556 = load i32, ptr %25, align 4, !tbaa !5
  %557 = srem i32 %555, %556
  store i32 %557, ptr %21, align 4, !tbaa !5
  %558 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %559 = load double, ptr %558, align 8, !tbaa !32
  %560 = fcmp oeq double %559, 0.000000e+00
  br i1 %560, label %561, label %565

561:                                              ; preds = %550
  %562 = load ptr, ptr %30, align 8, !tbaa !9
  %563 = load ptr, ptr %27, align 8, !tbaa !9
  %564 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecncpy(ptr noundef %562, ptr noundef %563, i32 noundef %564)
  br label %569

565:                                              ; preds = %550
  %566 = load ptr, ptr %30, align 8, !tbaa !9
  %567 = load ptr, ptr %29, align 8, !tbaa !9
  %568 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecncpy(ptr noundef %566, ptr noundef %567, i32 noundef %568)
  br label %569

569:                                              ; preds = %565, %561
  %570 = load i32, ptr %21, align 4, !tbaa !5
  store i32 %570, ptr %18, align 4, !tbaa !5
  store i32 0, ptr %17, align 4, !tbaa !5
  br label %571

571:                                              ; preds = %609, %569
  %572 = load i32, ptr %17, align 4, !tbaa !5
  %573 = load i32, ptr %22, align 4, !tbaa !5
  %574 = icmp slt i32 %572, %573
  br i1 %574, label %575, label %612

575:                                              ; preds = %571
  %576 = load i32, ptr %18, align 4, !tbaa !5
  %577 = load i32, ptr %25, align 4, !tbaa !5
  %578 = add nsw i32 %576, %577
  %579 = sub nsw i32 %578, 1
  %580 = load i32, ptr %25, align 4, !tbaa !5
  %581 = srem i32 %579, %580
  store i32 %581, ptr %18, align 4, !tbaa !5
  %582 = load ptr, ptr %33, align 8, !tbaa !9
  %583 = load i32, ptr %18, align 4, !tbaa !5
  %584 = sext i32 %583 to i64
  %585 = getelementptr inbounds %struct.tag_iteration_data, ptr %582, i64 %584
  store ptr %585, ptr %34, align 8, !tbaa !9
  %586 = load ptr, ptr %34, align 8, !tbaa !9
  %587 = getelementptr inbounds %struct.tag_iteration_data, ptr %586, i32 0, i32 0
  %588 = load ptr, ptr %34, align 8, !tbaa !9
  %589 = getelementptr inbounds %struct.tag_iteration_data, ptr %588, i32 0, i32 1
  %590 = load ptr, ptr %589, align 8, !tbaa !38
  %591 = load ptr, ptr %30, align 8, !tbaa !9
  %592 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecdot(ptr noundef %587, ptr noundef %590, ptr noundef %591, i32 noundef %592)
  %593 = load ptr, ptr %34, align 8, !tbaa !9
  %594 = getelementptr inbounds %struct.tag_iteration_data, ptr %593, i32 0, i32 3
  %595 = load double, ptr %594, align 8, !tbaa !37
  %596 = load ptr, ptr %34, align 8, !tbaa !9
  %597 = getelementptr inbounds %struct.tag_iteration_data, ptr %596, i32 0, i32 0
  %598 = load double, ptr %597, align 8, !tbaa !35
  %599 = fdiv double %598, %595
  store double %599, ptr %597, align 8, !tbaa !35
  %600 = load ptr, ptr %30, align 8, !tbaa !9
  %601 = load ptr, ptr %34, align 8, !tbaa !9
  %602 = getelementptr inbounds %struct.tag_iteration_data, ptr %601, i32 0, i32 2
  %603 = load ptr, ptr %602, align 8, !tbaa !39
  %604 = load ptr, ptr %34, align 8, !tbaa !9
  %605 = getelementptr inbounds %struct.tag_iteration_data, ptr %604, i32 0, i32 0
  %606 = load double, ptr %605, align 8, !tbaa !35
  %607 = fneg double %606
  %608 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecadd(ptr noundef %600, ptr noundef %603, double noundef %607, i32 noundef %608)
  br label %609

609:                                              ; preds = %575
  %610 = load i32, ptr %17, align 4, !tbaa !5
  %611 = add nsw i32 %610, 1
  store i32 %611, ptr %17, align 4, !tbaa !5
  br label %571, !llvm.loop !43

612:                                              ; preds = %571
  %613 = load ptr, ptr %30, align 8, !tbaa !9
  %614 = load double, ptr %35, align 8, !tbaa !12
  %615 = load double, ptr %36, align 8, !tbaa !12
  %616 = fdiv double %614, %615
  %617 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecscale(ptr noundef %613, double noundef %616, i32 noundef %617)
  store i32 0, ptr %17, align 4, !tbaa !5
  br label %618

618:                                              ; preds = %651, %612
  %619 = load i32, ptr %17, align 4, !tbaa !5
  %620 = load i32, ptr %22, align 4, !tbaa !5
  %621 = icmp slt i32 %619, %620
  br i1 %621, label %622, label %654

622:                                              ; preds = %618
  %623 = load ptr, ptr %33, align 8, !tbaa !9
  %624 = load i32, ptr %18, align 4, !tbaa !5
  %625 = sext i32 %624 to i64
  %626 = getelementptr inbounds %struct.tag_iteration_data, ptr %623, i64 %625
  store ptr %626, ptr %34, align 8, !tbaa !9
  %627 = load ptr, ptr %34, align 8, !tbaa !9
  %628 = getelementptr inbounds %struct.tag_iteration_data, ptr %627, i32 0, i32 2
  %629 = load ptr, ptr %628, align 8, !tbaa !39
  %630 = load ptr, ptr %30, align 8, !tbaa !9
  %631 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecdot(ptr noundef %39, ptr noundef %629, ptr noundef %630, i32 noundef %631)
  %632 = load ptr, ptr %34, align 8, !tbaa !9
  %633 = getelementptr inbounds %struct.tag_iteration_data, ptr %632, i32 0, i32 3
  %634 = load double, ptr %633, align 8, !tbaa !37
  %635 = load double, ptr %39, align 8, !tbaa !12
  %636 = fdiv double %635, %634
  store double %636, ptr %39, align 8, !tbaa !12
  %637 = load ptr, ptr %30, align 8, !tbaa !9
  %638 = load ptr, ptr %34, align 8, !tbaa !9
  %639 = getelementptr inbounds %struct.tag_iteration_data, ptr %638, i32 0, i32 1
  %640 = load ptr, ptr %639, align 8, !tbaa !38
  %641 = load ptr, ptr %34, align 8, !tbaa !9
  %642 = getelementptr inbounds %struct.tag_iteration_data, ptr %641, i32 0, i32 0
  %643 = load double, ptr %642, align 8, !tbaa !35
  %644 = load double, ptr %39, align 8, !tbaa !12
  %645 = fsub double %643, %644
  %646 = load i32, ptr %9, align 4, !tbaa !5
  call void @vecadd(ptr noundef %637, ptr noundef %640, double noundef %645, i32 noundef %646)
  %647 = load i32, ptr %18, align 4, !tbaa !5
  %648 = add nsw i32 %647, 1
  %649 = load i32, ptr %25, align 4, !tbaa !5
  %650 = srem i32 %648, %649
  store i32 %650, ptr %18, align 4, !tbaa !5
  br label %651

651:                                              ; preds = %622
  %652 = load i32, ptr %17, align 4, !tbaa !5
  %653 = add nsw i32 %652, 1
  store i32 %653, ptr %17, align 4, !tbaa !5
  br label %618, !llvm.loop !44

654:                                              ; preds = %618
  %655 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 13
  %656 = load double, ptr %655, align 8, !tbaa !32
  %657 = fcmp une double %656, 0.000000e+00
  br i1 %657, label %658, label %689

658:                                              ; preds = %654
  %659 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 14
  %660 = load i32, ptr %659, align 8, !tbaa !33
  store i32 %660, ptr %17, align 4, !tbaa !5
  br label %661

661:                                              ; preds = %685, %658
  %662 = load i32, ptr %17, align 4, !tbaa !5
  %663 = getelementptr inbounds %struct.lbfgs_parameter_t, ptr %24, i32 0, i32 15
  %664 = load i32, ptr %663, align 4, !tbaa !34
  %665 = icmp slt i32 %662, %664
  br i1 %665, label %666, label %688

666:                                              ; preds = %661
  %667 = load ptr, ptr %30, align 8, !tbaa !9
  %668 = load i32, ptr %17, align 4, !tbaa !5
  %669 = sext i32 %668 to i64
  %670 = getelementptr inbounds double, ptr %667, i64 %669
  %671 = load double, ptr %670, align 8, !tbaa !12
  %672 = load ptr, ptr %29, align 8, !tbaa !9
  %673 = load i32, ptr %17, align 4, !tbaa !5
  %674 = sext i32 %673 to i64
  %675 = getelementptr inbounds double, ptr %672, i64 %674
  %676 = load double, ptr %675, align 8, !tbaa !12
  %677 = fmul double %671, %676
  %678 = fcmp oge double %677, 0.000000e+00
  br i1 %678, label %679, label %684

679:                                              ; preds = %666
  %680 = load ptr, ptr %30, align 8, !tbaa !9
  %681 = load i32, ptr %17, align 4, !tbaa !5
  %682 = sext i32 %681 to i64
  %683 = getelementptr inbounds double, ptr %680, i64 %682
  store double 0.000000e+00, ptr %683, align 8, !tbaa !12
  br label %684

684:                                              ; preds = %679, %666
  br label %685

685:                                              ; preds = %684
  %686 = load i32, ptr %17, align 4, !tbaa !5
  %687 = add nsw i32 %686, 1
  store i32 %687, ptr %17, align 4, !tbaa !5
  br label %661, !llvm.loop !45

688:                                              ; preds = %661
  br label %689

689:                                              ; preds = %688, %654
  store double 1.000000e+00, ptr %23, align 8, !tbaa !12
  br label %364

690:                                              ; preds = %508, %487, %461
  br label %691

691:                                              ; preds = %690, %448, %407, %360, %268, %232, %223, %211
  %692 = load ptr, ptr %11, align 8, !tbaa !9
  %693 = icmp ne ptr %692, null
  br i1 %693, label %694, label %697

694:                                              ; preds = %691
  %695 = load double, ptr %40, align 8, !tbaa !12
  %696 = load ptr, ptr %11, align 8, !tbaa !9
  store double %695, ptr %696, align 8, !tbaa !12
  br label %697

697:                                              ; preds = %694, %691
  %698 = load ptr, ptr %32, align 8, !tbaa !9
  call void @vecfree(ptr noundef %698)
  %699 = load ptr, ptr %33, align 8, !tbaa !9
  %700 = icmp ne ptr %699, null
  br i1 %700, label %701, label %724

701:                                              ; preds = %697
  store i32 0, ptr %17, align 4, !tbaa !5
  br label %702

702:                                              ; preds = %719, %701
  %703 = load i32, ptr %17, align 4, !tbaa !5
  %704 = load i32, ptr %25, align 4, !tbaa !5
  %705 = icmp slt i32 %703, %704
  br i1 %705, label %706, label %722

706:                                              ; preds = %702
  %707 = load ptr, ptr %33, align 8, !tbaa !9
  %708 = load i32, ptr %17, align 4, !tbaa !5
  %709 = sext i32 %708 to i64
  %710 = getelementptr inbounds %struct.tag_iteration_data, ptr %707, i64 %709
  %711 = getelementptr inbounds %struct.tag_iteration_data, ptr %710, i32 0, i32 1
  %712 = load ptr, ptr %711, align 8, !tbaa !38
  call void @vecfree(ptr noundef %712)
  %713 = load ptr, ptr %33, align 8, !tbaa !9
  %714 = load i32, ptr %17, align 4, !tbaa !5
  %715 = sext i32 %714 to i64
  %716 = getelementptr inbounds %struct.tag_iteration_data, ptr %713, i64 %715
  %717 = getelementptr inbounds %struct.tag_iteration_data, ptr %716, i32 0, i32 2
  %718 = load ptr, ptr %717, align 8, !tbaa !39
  call void @vecfree(ptr noundef %718)
  br label %719

719:                                              ; preds = %706
  %720 = load i32, ptr %17, align 4, !tbaa !5
  %721 = add nsw i32 %720, 1
  store i32 %721, ptr %17, align 4, !tbaa !5
  br label %702, !llvm.loop !46

722:                                              ; preds = %702
  %723 = load ptr, ptr %33, align 8, !tbaa !9
  call void @vecfree(ptr noundef %723)
  br label %724

724:                                              ; preds = %722, %697
  %725 = load ptr, ptr %29, align 8, !tbaa !9
  call void @vecfree(ptr noundef %725)
  %726 = load ptr, ptr %31, align 8, !tbaa !9
  call void @vecfree(ptr noundef %726)
  %727 = load ptr, ptr %30, align 8, !tbaa !9
  call void @vecfree(ptr noundef %727)
  %728 = load ptr, ptr %28, align 8, !tbaa !9
  call void @vecfree(ptr noundef %728)
  %729 = load ptr, ptr %27, align 8, !tbaa !9
  call void @vecfree(ptr noundef %729)
  %730 = load ptr, ptr %26, align 8, !tbaa !9
  call void @vecfree(ptr noundef %730)
  %731 = load i32, ptr %16, align 4, !tbaa !5
  store i32 %731, ptr %8, align 4
  store i32 1, ptr %44, align 4
  br label %732

732:                                              ; preds = %724, %174, %167, %158, %145, %135, %130, %125, %120, %114, %95, %90, %83, %78, %73, %68, %63
  call void @llvm.lifetime.end.p0(i64 32, ptr %43) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %40) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %38) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %37) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %35) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 112, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #5
  %733 = load i32, ptr %8, align 4
  ret i32 %733
}

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

; Function Attrs: nounwind uwtable
declare hidden i32 @line_search_morethuente(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @line_search_backtracking_owlqn(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @line_search_backtracking(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden double @owlqn_x1norm(ptr noundef, i32 noundef, i32 noundef) #2

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

; Function Attrs: nounwind uwtable
declare hidden void @owlqn_pseudo_gradient(ptr noundef, ptr noundef, ptr noundef, i32 noundef, double noundef, i32 noundef, i32 noundef) #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecncpy(ptr noundef, ptr noundef, i32 noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vec2norm(ptr noundef, ptr noundef, i32 noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vec2norminv(ptr noundef, ptr noundef, i32 noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @veccpy(ptr noundef, ptr noundef, i32 noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecdiff(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecdot(ptr noundef, ptr noundef, ptr noundef, i32 noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecadd(ptr noundef, ptr noundef, double noundef, i32 noundef) #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecscale(ptr noundef, double noundef, i32 noundef) #0

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

attributes #0 = { inlinehint nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
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 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{i64 0, i64 4, !5, i64 8, i64 8, !12, i64 16, i64 4, !5, i64 24, i64 8, !12, i64 32, i64 4, !5, i64 36, i64 4, !5, i64 40, i64 4, !5, i64 48, i64 8, !12, i64 56, i64 8, !12, i64 64, i64 8, !12, i64 72, i64 8, !12, i64 80, i64 8, !12, i64 88, i64 8, !12, i64 96, i64 8, !12, i64 104, i64 4, !5, i64 108, i64 4, !5}
!12 = !{!13, !13, i64 0}
!13 = !{!"double", !7, i64 0}
!14 = !{!15, !6, i64 0}
!15 = !{!"", !6, i64 0, !13, i64 8, !6, i64 16, !13, i64 24, !6, i64 32, !6, i64 36, !6, i64 40, !13, i64 48, !13, i64 56, !13, i64 64, !13, i64 72, !13, i64 80, !13, i64 88, !13, i64 96, !6, i64 104, !6, i64 108}
!16 = !{!17, !6, i64 0}
!17 = !{!"tag_callback_data", !6, i64 0, !10, i64 8, !10, i64 16, !10, i64 24}
!18 = !{!17, !10, i64 8}
!19 = !{!17, !10, i64 16}
!20 = !{!17, !10, i64 24}
!21 = !{!15, !13, i64 8}
!22 = !{!15, !6, i64 16}
!23 = !{!15, !13, i64 24}
!24 = !{!15, !13, i64 48}
!25 = !{!15, !13, i64 56}
!26 = !{!15, !13, i64 64}
!27 = !{!15, !6, i64 36}
!28 = !{!15, !13, i64 72}
!29 = !{!15, !13, i64 80}
!30 = !{!15, !13, i64 88}
!31 = !{!15, !6, i64 40}
!32 = !{!15, !13, i64 96}
!33 = !{!15, !6, i64 104}
!34 = !{!15, !6, i64 108}
!35 = !{!36, !13, i64 0}
!36 = !{!"tag_iteration_data", !13, i64 0, !10, i64 8, !10, i64 16, !13, i64 24}
!37 = !{!36, !13, i64 24}
!38 = !{!36, !10, i64 8}
!39 = !{!36, !10, i64 16}
!40 = distinct !{!40, !41}
!41 = !{!"llvm.loop.mustprogress"}
!42 = !{!15, !6, i64 32}
!43 = distinct !{!43, !41}
!44 = distinct !{!44, !41}
!45 = distinct !{!45, !41}
!46 = distinct !{!46, !41}


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

%struct.lbfgs_parameter_t = type { i32, double, i32, double, i32, i32, i32, double, double, double, double, double, double, double, i32, i32 }
%struct.tag_callback_data = type { i32, ptr, ptr, ptr }
%struct.tag_iteration_data = type { double, ptr, ptr, double }

@_defparam = external hidden local_unnamed_addr constant %struct.lbfgs_parameter_t, align 8
@switch.table.lbfgs = private unnamed_addr constant [4 x ptr] [ptr @line_search_morethuente, ptr @line_search_backtracking, ptr @line_search_backtracking, ptr @line_search_backtracking], align 8

; Function Attrs: inlinehint nounwind uwtable
declare hidden ptr @vecalloc(i64 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecfree(ptr noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #1

; Function Attrs: nounwind uwtable
define dso_local i32 @lbfgs(i32 noundef %0, ptr noundef %1, ptr noundef writeonly %2, ptr noundef %3, ptr noundef %4, ptr noundef %5, ptr noundef readonly %6) local_unnamed_addr #2 {
  %8 = alloca double, align 8
  %9 = alloca %struct.lbfgs_parameter_t, align 8
  %10 = alloca double, align 8
  %11 = alloca double, align 8
  %12 = alloca double, align 8
  %13 = alloca double, align 8
  %14 = alloca double, align 8
  %15 = alloca double, align 8
  %16 = alloca %struct.tag_callback_data, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %8) #6
  call void @llvm.lifetime.start.p0(i64 112, ptr nonnull %9) #6
  %.not = icmp eq ptr %6, null
  br i1 %.not, label %18, label %17

17:                                               ; preds = %7
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(112) %9, ptr noundef nonnull align 8 dereferenceable(112) %6, i64 112, i1 false), !tbaa.struct !5
  br label %19

18:                                               ; preds = %7
  call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(112) %9, ptr noundef nonnull align 8 dereferenceable(112) @_defparam, i64 112, i1 false), !tbaa.struct !5
  br label %19

19:                                               ; preds = %18, %17
  %20 = load i32, ptr %9, align 8, !tbaa !12
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %10) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %12) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %13) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %14) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %15) #6
  store double 0.000000e+00, ptr %15, align 8, !tbaa !10
  call void @llvm.lifetime.start.p0(i64 32, ptr nonnull %16) #6
  store i32 %0, ptr %16, align 8, !tbaa !14
  %21 = getelementptr inbounds i8, ptr %16, i64 8
  store ptr %5, ptr %21, align 8, !tbaa !17
  %22 = getelementptr inbounds i8, ptr %16, i64 16
  store ptr %3, ptr %22, align 8, !tbaa !18
  %23 = getelementptr inbounds i8, ptr %16, i64 24
  store ptr %4, ptr %23, align 8, !tbaa !19
  %24 = icmp slt i32 %0, 1
  br i1 %24, label %311, label %25

25:                                               ; preds = %19
  %26 = getelementptr inbounds i8, ptr %9, i64 8
  %27 = load double, ptr %26, align 8, !tbaa !20
  %28 = fcmp olt double %27, 0.000000e+00
  br i1 %28, label %311, label %29

29:                                               ; preds = %25
  %30 = getelementptr inbounds i8, ptr %9, i64 16
  %31 = load i32, ptr %30, align 8, !tbaa !21
  %32 = icmp slt i32 %31, 0
  br i1 %32, label %311, label %33

33:                                               ; preds = %29
  %34 = getelementptr inbounds i8, ptr %9, i64 24
  %35 = load double, ptr %34, align 8, !tbaa !22
  %36 = fcmp olt double %35, 0.000000e+00
  br i1 %36, label %311, label %37

37:                                               ; preds = %33
  %38 = getelementptr inbounds i8, ptr %9, i64 48
  %39 = load double, ptr %38, align 8, !tbaa !23
  %40 = fcmp olt double %39, 0.000000e+00
  br i1 %40, label %311, label %41

41:                                               ; preds = %37
  %42 = getelementptr inbounds i8, ptr %9, i64 56
  %43 = load double, ptr %42, align 8, !tbaa !24
  %44 = fcmp olt double %43, %39
  br i1 %44, label %311, label %45

45:                                               ; preds = %41
  %46 = getelementptr inbounds i8, ptr %9, i64 64
  %47 = load double, ptr %46, align 8, !tbaa !25
  %48 = fcmp olt double %47, 0.000000e+00
  br i1 %48, label %311, label %49

49:                                               ; preds = %45
  %50 = getelementptr inbounds i8, ptr %9, i64 36
  %51 = load i32, ptr %50, align 4
  %52 = and i32 %51, -2
  %or.cond = icmp eq i32 %52, 2
  br i1 %or.cond, label %53, label %58

53:                                               ; preds = %49
  %54 = getelementptr inbounds i8, ptr %9, i64 72
  %55 = load double, ptr %54, align 8
  %56 = fcmp ole double %55, %47
  %57 = fcmp oge double %55, 1.000000e+00
  %or.cond5 = or i1 %56, %57
  br i1 %or.cond5, label %311, label %58

58:                                               ; preds = %53, %49
  %59 = getelementptr inbounds i8, ptr %9, i64 80
  %60 = load double, ptr %59, align 8, !tbaa !26
  %61 = fcmp olt double %60, 0.000000e+00
  br i1 %61, label %311, label %62

62:                                               ; preds = %58
  %63 = getelementptr inbounds i8, ptr %9, i64 88
  %64 = load double, ptr %63, align 8, !tbaa !27
  %65 = fcmp olt double %64, 0.000000e+00
  br i1 %65, label %311, label %66

66:                                               ; preds = %62
  %67 = getelementptr inbounds i8, ptr %9, i64 40
  %68 = load i32, ptr %67, align 8, !tbaa !28
  %69 = icmp slt i32 %68, 1
  br i1 %69, label %311, label %70

70:                                               ; preds = %66
  %71 = getelementptr inbounds i8, ptr %9, i64 96
  %72 = load double, ptr %71, align 8, !tbaa !29
  %73 = fcmp olt double %72, 0.000000e+00
  br i1 %73, label %311, label %74

74:                                               ; preds = %70
  %75 = getelementptr inbounds i8, ptr %9, i64 104
  %76 = load i32, ptr %75, align 8, !tbaa !30
  %or.cond261 = icmp ugt i32 %76, %0
  br i1 %or.cond261, label %311, label %77

77:                                               ; preds = %74
  %78 = getelementptr inbounds i8, ptr %9, i64 108
  %79 = load i32, ptr %78, align 4, !tbaa !31
  %80 = icmp slt i32 %79, 0
  br i1 %80, label %.thread, label %81

.thread:                                          ; preds = %77
  store i32 %0, ptr %78, align 4, !tbaa !31
  br label %83

81:                                               ; preds = %77
  %82 = icmp ugt i32 %79, %0
  br i1 %82, label %311, label %83

83:                                               ; preds = %.thread, %81
  %84 = phi i32 [ %0, %.thread ], [ %79, %81 ]
  %85 = fcmp une double %72, 0.000000e+00
  br i1 %85, label %86, label %87

86:                                               ; preds = %83
  %cond = icmp eq i32 %51, 2
  br i1 %cond, label %90, label %311

87:                                               ; preds = %83
  %88 = icmp ult i32 %51, 4
  br i1 %88, label %switch.lookup, label %311

switch.lookup:                                    ; preds = %87
  %89 = zext nneg i32 %51 to i64
  %switch.gep = getelementptr inbounds [4 x ptr], ptr @switch.table.lbfgs, i64 0, i64 %89
  %switch.load = load ptr, ptr %switch.gep, align 8
  br label %90

90:                                               ; preds = %switch.lookup, %86
  %.0 = phi ptr [ @line_search_backtracking_owlqn, %86 ], [ %switch.load, %switch.lookup ]
  %91 = zext nneg i32 %0 to i64
  %92 = shl nuw nsw i64 %91, 3
  %93 = tail call ptr @vecalloc(i64 noundef %92)
  %94 = tail call ptr @vecalloc(i64 noundef %92)
  %95 = tail call ptr @vecalloc(i64 noundef %92)
  %96 = tail call ptr @vecalloc(i64 noundef %92)
  %97 = tail call ptr @vecalloc(i64 noundef %92)
  %98 = insertelement <4 x ptr> poison, ptr %93, i64 0
  %99 = insertelement <4 x ptr> %98, ptr %94, i64 1
  %100 = insertelement <4 x ptr> %99, ptr %95, i64 2
  %101 = insertelement <4 x ptr> %100, ptr %96, i64 3
  %.fr = freeze <4 x ptr> %101
  %102 = icmp eq <4 x ptr> %.fr, zeroinitializer
  %103 = icmp eq ptr %97, null
  %104 = bitcast <4 x i1> %102 to i4
  %105 = icmp ne i4 %104, 0
  %op.rdx = select i1 %105, i1 true, i1 %103
  br i1 %op.rdx, label %.loopexit264, label %106

106:                                              ; preds = %90
  br i1 %85, label %107, label %110

107:                                              ; preds = %106
  %108 = tail call ptr @vecalloc(i64 noundef %92)
  %109 = icmp eq ptr %108, null
  br i1 %109, label %.loopexit264, label %110

110:                                              ; preds = %107, %106
  %.0220 = phi ptr [ %108, %107 ], [ null, %106 ]
  %111 = sext i32 %20 to i64
  %112 = shl nsw i64 %111, 5
  %113 = tail call ptr @vecalloc(i64 noundef %112)
  %114 = icmp eq ptr %113, null
  br i1 %114, label %.loopexit264, label %.preheader265

.preheader265:                                    ; preds = %110
  %115 = icmp sgt i32 %20, 0
  br i1 %115, label %.lr.ph.preheader, label %._crit_edge

.lr.ph.preheader:                                 ; preds = %.preheader265
  %wide.trip.count = zext nneg i32 %20 to i64
  br label %.lr.ph

116:                                              ; preds = %.lr.ph
  %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 %._crit_edge, label %.lr.ph, !llvm.loop !32

.lr.ph:                                           ; preds = %.lr.ph.preheader, %116
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %116 ]
  %117 = getelementptr inbounds %struct.tag_iteration_data, ptr %113, i64 %indvars.iv
  store double 0.000000e+00, ptr %117, align 8, !tbaa !34
  %118 = getelementptr inbounds i8, ptr %117, i64 24
  store double 0.000000e+00, ptr %118, align 8, !tbaa !36
  %119 = tail call ptr @vecalloc(i64 noundef %92)
  %120 = getelementptr inbounds i8, ptr %117, i64 8
  store ptr %119, ptr %120, align 8, !tbaa !37
  %121 = tail call ptr @vecalloc(i64 noundef %92)
  %122 = getelementptr inbounds i8, ptr %117, i64 16
  store ptr %121, ptr %122, align 8, !tbaa !38
  %123 = load ptr, ptr %120, align 8, !tbaa !37
  %124 = icmp eq ptr %123, null
  %125 = icmp eq ptr %121, null
  %or.cond262 = select i1 %124, i1 true, i1 %125
  br i1 %or.cond262, label %.loopexit264, label %116

._crit_edge:                                      ; preds = %116, %.preheader265
  %.not306 = icmp eq i32 %31, 0
  br i1 %.not306, label %130, label %126

126:                                              ; preds = %._crit_edge
  %127 = zext nneg i32 %31 to i64
  %128 = shl nuw nsw i64 %127, 3
  %129 = tail call ptr @vecalloc(i64 noundef %128)
  br label %130

130:                                              ; preds = %126, %._crit_edge
  %.0219 = phi ptr [ %129, %126 ], [ null, %._crit_edge ]
  %131 = tail call double %3(ptr noundef %5, ptr noundef %1, ptr noundef %94, i32 noundef %0, double noundef 0.000000e+00) #6
  store double %131, ptr %15, align 8, !tbaa !10
  br i1 %85, label %132, label %135

132:                                              ; preds = %130
  %133 = tail call double @owlqn_x1norm(ptr noundef %1, i32 noundef %76, i32 noundef %84)
  store double %133, ptr %12, align 8, !tbaa !10
  %134 = tail call double @llvm.fmuladd.f64(double %133, double %72, double %131)
  store double %134, ptr %15, align 8, !tbaa !10
  tail call void @owlqn_pseudo_gradient(ptr noundef %.0220, ptr noundef %1, ptr noundef %94, i32 noundef %0, double noundef %72, i32 noundef %76, i32 noundef %84)
  br label %135

135:                                              ; preds = %132, %130
  %136 = phi double [ %134, %132 ], [ %131, %130 ]
  %.not252 = icmp eq ptr %.0219, null
  br i1 %.not252, label %138, label %137

137:                                              ; preds = %135
  store double %136, ptr %.0219, align 8, !tbaa !10
  %.pre = load double, ptr %71, align 8, !tbaa !29
  br label %138

138:                                              ; preds = %137, %135
  %139 = phi double [ %.pre, %137 ], [ %72, %135 ]
  %140 = fcmp oeq double %139, 0.000000e+00
  %..0220 = select i1 %140, ptr %94, ptr %.0220
  tail call void @vecncpy(ptr noundef %96, ptr noundef %..0220, i32 noundef %0)
  call void @vec2norm(ptr noundef nonnull %12, ptr noundef %1, i32 noundef %0)
  %141 = load double, ptr %71, align 8, !tbaa !29
  %142 = fcmp oeq double %141, 0.000000e+00
  %.0220.sink309 = select i1 %142, ptr %94, ptr %.0220
  call void @vec2norm(ptr noundef nonnull %13, ptr noundef %.0220.sink309, i32 noundef %0)
  %143 = load double, ptr %12, align 8, !tbaa !10
  %144 = fcmp olt double %143, 1.000000e+00
  br i1 %144, label %145, label %146

145:                                              ; preds = %138
  store double 1.000000e+00, ptr %12, align 8, !tbaa !10
  br label %146

146:                                              ; preds = %145, %138
  %147 = phi double [ 1.000000e+00, %145 ], [ %143, %138 ]
  %148 = load double, ptr %13, align 8, !tbaa !10
  %149 = fdiv double %148, %147
  %150 = load double, ptr %26, align 8, !tbaa !20
  %151 = fcmp ugt double %149, %150
  br i1 %151, label %152, label %.loopexit264

152:                                              ; preds = %146
  call void @vec2norminv(ptr noundef nonnull %8, ptr noundef %96, i32 noundef %0)
  %153 = getelementptr inbounds i8, ptr %9, i64 32
  %154 = add i32 %20, -1
  %invariant.gep = getelementptr i8, ptr %96, i64 8
  %invariant.gep332 = getelementptr i8, ptr %96, i64 16
  %invariant.gep334 = getelementptr i8, ptr %96, i64 24
  br label %155

155:                                              ; preds = %.loopexit, %152
  %.0226 = phi i32 [ 1, %152 ], [ %215, %.loopexit ]
  %.0224 = phi i32 [ 0, %152 ], [ %217, %.loopexit ]
  %smin289 = call i32 @llvm.smin.i32(i32 %20, i32 %.0226)
  call void @veccpy(ptr noundef %93, ptr noundef %1, i32 noundef %0)
  call void @veccpy(ptr noundef %95, ptr noundef %94, i32 noundef %0)
  %156 = load double, ptr %71, align 8, !tbaa !29
  %157 = fcmp oeq double %156, 0.000000e+00
  br i1 %157, label %158, label %160

158:                                              ; preds = %155
  %159 = call i32 %.0(i32 noundef %0, ptr noundef %1, ptr noundef nonnull %15, ptr noundef %94, ptr noundef %96, ptr noundef nonnull %8, ptr noundef %93, ptr noundef %95, ptr noundef %97, ptr noundef nonnull %16, ptr noundef nonnull %9) #6, !callees !39
  br label %165

160:                                              ; preds = %155
  %161 = call i32 %.0(i32 noundef %0, ptr noundef %1, ptr noundef nonnull %15, ptr noundef %94, ptr noundef %96, ptr noundef nonnull %8, ptr noundef %93, ptr noundef %.0220, ptr noundef %97, ptr noundef nonnull %16, ptr noundef nonnull %9) #6, !callees !39
  %162 = load double, ptr %71, align 8, !tbaa !29
  %163 = load i32, ptr %75, align 8, !tbaa !30
  %164 = load i32, ptr %78, align 4, !tbaa !31
  call void @owlqn_pseudo_gradient(ptr noundef %.0220, ptr noundef %1, ptr noundef %94, i32 noundef %0, double noundef %162, i32 noundef %163, i32 noundef %164)
  br label %165

165:                                              ; preds = %160, %158
  %.0225 = phi i32 [ %159, %158 ], [ %161, %160 ]
  %166 = icmp slt i32 %.0225, 0
  br i1 %166, label %167, label %168

167:                                              ; preds = %165
  call void @veccpy(ptr noundef %1, ptr noundef %93, i32 noundef %0)
  call void @veccpy(ptr noundef %94, ptr noundef %95, i32 noundef %0)
  br label %.loopexit264

168:                                              ; preds = %165
  call void @vec2norm(ptr noundef nonnull %12, ptr noundef %1, i32 noundef %0)
  %169 = load double, ptr %71, align 8, !tbaa !29
  %170 = fcmp oeq double %169, 0.000000e+00
  %..0220312 = select i1 %170, ptr %94, ptr %.0220
  call void @vec2norm(ptr noundef nonnull %13, ptr noundef %..0220312, i32 noundef %0)
  %171 = load ptr, ptr %23, align 8, !tbaa !19
  %.not253 = icmp eq ptr %171, null
  br i1 %.not253, label %180, label %172

172:                                              ; preds = %168
  %173 = load ptr, ptr %21, align 8, !tbaa !17
  %174 = load double, ptr %15, align 8, !tbaa !10
  %175 = load double, ptr %12, align 8, !tbaa !10
  %176 = load double, ptr %13, align 8, !tbaa !10
  %177 = load double, ptr %8, align 8, !tbaa !10
  %178 = load i32, ptr %16, align 8, !tbaa !14
  %179 = call i32 %171(ptr noundef %173, ptr noundef %1, ptr noundef %94, double noundef %174, double noundef %175, double noundef %176, double noundef %177, i32 noundef %178, i32 noundef %.0226, i32 noundef %.0225) #6
  %.not254 = icmp eq i32 %179, 0
  br i1 %.not254, label %180, label %.loopexit264

180:                                              ; preds = %172, %168
  %181 = load double, ptr %12, align 8, !tbaa !10
  %182 = fcmp olt double %181, 1.000000e+00
  br i1 %182, label %183, label %184

183:                                              ; preds = %180
  store double 1.000000e+00, ptr %12, align 8, !tbaa !10
  br label %184

184:                                              ; preds = %183, %180
  %185 = phi double [ 1.000000e+00, %183 ], [ %181, %180 ]
  %186 = load double, ptr %13, align 8, !tbaa !10
  %187 = fdiv double %186, %185
  %188 = load double, ptr %26, align 8, !tbaa !20
  %189 = fcmp ugt double %187, %188
  br i1 %189, label %190, label %.loopexit264

190:                                              ; preds = %184
  br i1 %.not252, label %201, label %191

191:                                              ; preds = %190
  %192 = load i32, ptr %30, align 8, !tbaa !21
  %.not255 = icmp sgt i32 %192, %.0226
  %.pre301 = load double, ptr %15, align 8, !tbaa !10
  %.pre303 = srem i32 %.0226, %192
  %.pre304 = zext nneg i32 %.pre303 to i64
  br i1 %.not255, label %._crit_edge302, label %193

193:                                              ; preds = %191
  %194 = getelementptr inbounds double, ptr %.0219, i64 %.pre304
  %195 = load double, ptr %194, align 8, !tbaa !10
  %196 = fsub double %195, %.pre301
  %197 = fdiv double %196, %.pre301
  %198 = load double, ptr %34, align 8, !tbaa !22
  %199 = fcmp olt double %197, %198
  br i1 %199, label %.loopexit264, label %._crit_edge302

._crit_edge302:                                   ; preds = %191, %193
  %200 = getelementptr inbounds double, ptr %.0219, i64 %.pre304
  store double %.pre301, ptr %200, align 8, !tbaa !10
  br label %201

201:                                              ; preds = %._crit_edge302, %190
  %202 = load i32, ptr %153, align 8, !tbaa !40
  %.not256 = icmp eq i32 %202, 0
  %.not257 = icmp sgt i32 %202, %.0226
  %or.cond263 = select i1 %.not256, i1 true, i1 %.not257
  br i1 %or.cond263, label %203, label %.loopexit264

203:                                              ; preds = %201
  %204 = sext i32 %.0224 to i64
  %205 = getelementptr inbounds %struct.tag_iteration_data, ptr %113, i64 %204
  %206 = getelementptr inbounds i8, ptr %205, i64 8
  %207 = load ptr, ptr %206, align 8, !tbaa !37
  call void @vecdiff(ptr noundef %207, ptr noundef %1, ptr noundef %93, i32 noundef %0)
  %208 = getelementptr inbounds i8, ptr %205, i64 16
  %209 = load ptr, ptr %208, align 8, !tbaa !38
  call void @vecdiff(ptr noundef %209, ptr noundef %94, ptr noundef %95, i32 noundef %0)
  %210 = load ptr, ptr %208, align 8, !tbaa !38
  %211 = load ptr, ptr %206, align 8, !tbaa !37
  call void @vecdot(ptr noundef nonnull %10, ptr noundef %210, ptr noundef %211, i32 noundef %0)
  %212 = load ptr, ptr %208, align 8, !tbaa !38
  call void @vecdot(ptr noundef nonnull %11, ptr noundef %212, ptr noundef %212, i32 noundef %0)
  %213 = load double, ptr %10, align 8, !tbaa !10
  %214 = getelementptr inbounds i8, ptr %205, i64 24
  store double %213, ptr %214, align 8, !tbaa !36
  %215 = add nuw nsw i32 %.0226, 1
  %216 = add nsw i32 %.0224, 1
  %217 = srem i32 %216, %20
  %218 = load double, ptr %71, align 8, !tbaa !29
  %219 = fcmp oeq double %218, 0.000000e+00
  %..0220313 = select i1 %219, ptr %94, ptr %.0220
  call void @vecncpy(ptr noundef %96, ptr noundef %..0220313, i32 noundef %0)
  br i1 %115, label %.lr.ph272, label %._crit_edge273

.lr.ph272:                                        ; preds = %203, %.lr.ph272
  %.0227270 = phi i32 [ %221, %.lr.ph272 ], [ %217, %203 ]
  %.1230269 = phi i32 [ %233, %.lr.ph272 ], [ 0, %203 ]
  %220 = add i32 %154, %.0227270
  %221 = srem i32 %220, %20
  %222 = sext i32 %221 to i64
  %223 = getelementptr inbounds %struct.tag_iteration_data, ptr %113, i64 %222
  %224 = getelementptr inbounds i8, ptr %223, i64 8
  %225 = load ptr, ptr %224, align 8, !tbaa !37
  call void @vecdot(ptr noundef nonnull %223, ptr noundef %225, ptr noundef %96, i32 noundef %0)
  %226 = getelementptr inbounds i8, ptr %223, i64 24
  %227 = load double, ptr %226, align 8, !tbaa !36
  %228 = load double, ptr %223, align 8, !tbaa !34
  %229 = fdiv double %228, %227
  store double %229, ptr %223, align 8, !tbaa !34
  %230 = getelementptr inbounds i8, ptr %223, i64 16
  %231 = load ptr, ptr %230, align 8, !tbaa !38
  %232 = fneg double %229
  call void @vecadd(ptr noundef %96, ptr noundef %231, double noundef %232, i32 noundef %0)
  %233 = add nuw nsw i32 %.1230269, 1
  %exitcond288.not = icmp eq i32 %233, %smin289
  br i1 %exitcond288.not, label %._crit_edge273, label %.lr.ph272, !llvm.loop !41

._crit_edge273:                                   ; preds = %.lr.ph272, %203
  %.0227.lcssa = phi i32 [ %217, %203 ], [ %221, %.lr.ph272 ]
  %234 = load double, ptr %10, align 8, !tbaa !10
  %235 = load double, ptr %11, align 8, !tbaa !10
  %236 = fdiv double %234, %235
  call void @vecscale(ptr noundef %96, double noundef %236, i32 noundef %0)
  br i1 %115, label %.lr.ph277, label %._crit_edge278

.lr.ph277:                                        ; preds = %._crit_edge273, %.lr.ph277
  %.1228275 = phi i32 [ %250, %.lr.ph277 ], [ %.0227.lcssa, %._crit_edge273 ]
  %.2274 = phi i32 [ %251, %.lr.ph277 ], [ 0, %._crit_edge273 ]
  %237 = sext i32 %.1228275 to i64
  %238 = getelementptr inbounds %struct.tag_iteration_data, ptr %113, i64 %237
  %239 = getelementptr inbounds i8, ptr %238, i64 16
  %240 = load ptr, ptr %239, align 8, !tbaa !38
  call void @vecdot(ptr noundef nonnull %14, ptr noundef %240, ptr noundef %96, i32 noundef %0)
  %241 = getelementptr inbounds i8, ptr %238, i64 24
  %242 = load double, ptr %241, align 8, !tbaa !36
  %243 = load double, ptr %14, align 8, !tbaa !10
  %244 = fdiv double %243, %242
  store double %244, ptr %14, align 8, !tbaa !10
  %245 = getelementptr inbounds i8, ptr %238, i64 8
  %246 = load ptr, ptr %245, align 8, !tbaa !37
  %247 = load double, ptr %238, align 8, !tbaa !34
  %248 = fsub double %247, %244
  call void @vecadd(ptr noundef %96, ptr noundef %246, double noundef %248, i32 noundef %0)
  %249 = add nsw i32 %.1228275, 1
  %250 = srem i32 %249, %20
  %251 = add nuw nsw i32 %.2274, 1
  %exitcond290.not = icmp eq i32 %251, %smin289
  br i1 %exitcond290.not, label %._crit_edge278, label %.lr.ph277, !llvm.loop !42

._crit_edge278:                                   ; preds = %.lr.ph277, %._crit_edge273
  %252 = load double, ptr %71, align 8, !tbaa !29
  %253 = fcmp une double %252, 0.000000e+00
  br i1 %253, label %254, label %.loopexit

254:                                              ; preds = %._crit_edge278
  %255 = load i32, ptr %75, align 8, !tbaa !30
  %256 = load i32, ptr %78, align 4, !tbaa !31
  %257 = icmp slt i32 %255, %256
  br i1 %257, label %.lr.ph281.preheader, label %.loopexit

.lr.ph281.preheader:                              ; preds = %254
  %258 = sext i32 %255 to i64
  %wide.trip.count294 = sext i32 %256 to i64
  %259 = sub nsw i64 %wide.trip.count294, %258
  %min.iters.check = icmp ult i64 %259, 4
  br i1 %min.iters.check, label %.lr.ph281.preheader328, label %vector.memcheck

vector.memcheck:                                  ; preds = %.lr.ph281.preheader
  %260 = shl nsw i64 %258, 3
  %scevgep = getelementptr i8, ptr %96, i64 %260
  %261 = shl nsw i64 %wide.trip.count294, 3
  %scevgep316 = getelementptr i8, ptr %96, i64 %261
  %scevgep317 = getelementptr i8, ptr %.0220, i64 %260
  %scevgep318 = getelementptr i8, ptr %.0220, i64 %261
  %bound0 = icmp ult ptr %scevgep, %scevgep318
  %bound1 = icmp ult ptr %scevgep317, %scevgep316
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph281.preheader328, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %259, -4
  %ind.end = add nsw i64 %n.vec, %258
  br label %vector.body

vector.body:                                      ; preds = %pred.store.continue327, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %pred.store.continue327 ]
  %offset.idx = add i64 %index, %258
  %262 = getelementptr inbounds double, ptr %96, i64 %offset.idx
  %263 = getelementptr inbounds i8, ptr %262, i64 16
  %wide.load = load <2 x double>, ptr %262, align 8, !tbaa !10, !alias.scope !43, !noalias !46
  %wide.load319 = load <2 x double>, ptr %263, align 8, !tbaa !10, !alias.scope !43, !noalias !46
  %264 = getelementptr inbounds double, ptr %.0220, i64 %offset.idx
  %265 = getelementptr inbounds i8, ptr %264, i64 16
  %wide.load320 = load <2 x double>, ptr %264, align 8, !tbaa !10, !alias.scope !46
  %wide.load321 = load <2 x double>, ptr %265, align 8, !tbaa !10, !alias.scope !46
  %266 = fmul <2 x double> %wide.load, %wide.load320
  %267 = fmul <2 x double> %wide.load319, %wide.load321
  %268 = fcmp oge <2 x double> %266, zeroinitializer
  %269 = fcmp oge <2 x double> %267, zeroinitializer
  %270 = extractelement <2 x i1> %268, i64 0
  br i1 %270, label %pred.store.if, label %pred.store.continue

pred.store.if:                                    ; preds = %vector.body
  %271 = getelementptr inbounds double, ptr %96, i64 %offset.idx
  store double 0.000000e+00, ptr %271, align 8, !tbaa !10, !alias.scope !43, !noalias !46
  br label %pred.store.continue

pred.store.continue:                              ; preds = %pred.store.if, %vector.body
  %272 = extractelement <2 x i1> %268, i64 1
  br i1 %272, label %pred.store.if322, label %pred.store.continue323

pred.store.if322:                                 ; preds = %pred.store.continue
  %gep = getelementptr double, ptr %invariant.gep, i64 %offset.idx
  store double 0.000000e+00, ptr %gep, align 8, !tbaa !10, !alias.scope !43, !noalias !46
  br label %pred.store.continue323

pred.store.continue323:                           ; preds = %pred.store.if322, %pred.store.continue
  %273 = extractelement <2 x i1> %269, i64 0
  br i1 %273, label %pred.store.if324, label %pred.store.continue325

pred.store.if324:                                 ; preds = %pred.store.continue323
  %gep333 = getelementptr double, ptr %invariant.gep332, i64 %offset.idx
  store double 0.000000e+00, ptr %gep333, align 8, !tbaa !10, !alias.scope !43, !noalias !46
  br label %pred.store.continue325

pred.store.continue325:                           ; preds = %pred.store.if324, %pred.store.continue323
  %274 = extractelement <2 x i1> %269, i64 1
  br i1 %274, label %pred.store.if326, label %pred.store.continue327

pred.store.if326:                                 ; preds = %pred.store.continue325
  %gep335 = getelementptr double, ptr %invariant.gep334, i64 %offset.idx
  store double 0.000000e+00, ptr %gep335, align 8, !tbaa !10, !alias.scope !43, !noalias !46
  br label %pred.store.continue327

pred.store.continue327:                           ; preds = %pred.store.if326, %pred.store.continue325
  %index.next = add nuw i64 %index, 4
  %275 = icmp eq i64 %index.next, %n.vec
  br i1 %275, label %middle.block, label %vector.body, !llvm.loop !48

middle.block:                                     ; preds = %pred.store.continue327
  %cmp.n = icmp eq i64 %259, %n.vec
  br i1 %cmp.n, label %.loopexit, label %.lr.ph281.preheader328

.lr.ph281.preheader328:                           ; preds = %middle.block, %vector.memcheck, %.lr.ph281.preheader
  %indvars.iv291.ph = phi i64 [ %258, %vector.memcheck ], [ %258, %.lr.ph281.preheader ], [ %ind.end, %middle.block ]
  %276 = sub nsw i64 %wide.trip.count294, %indvars.iv291.ph
  %xtraiter = and i64 %276, 1
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph281.prol.loopexit, label %.lr.ph281.prol

.lr.ph281.prol:                                   ; preds = %.lr.ph281.preheader328
  %277 = getelementptr inbounds double, ptr %96, i64 %indvars.iv291.ph
  %278 = load double, ptr %277, align 8, !tbaa !10
  %279 = getelementptr inbounds double, ptr %.0220, i64 %indvars.iv291.ph
  %280 = load double, ptr %279, align 8, !tbaa !10
  %281 = fmul double %278, %280
  %282 = fcmp ult double %281, 0.000000e+00
  br i1 %282, label %.lr.ph281.prol.loopexit.unr-lcssa, label %283

283:                                              ; preds = %.lr.ph281.prol
  store double 0.000000e+00, ptr %277, align 8, !tbaa !10
  br label %.lr.ph281.prol.loopexit.unr-lcssa

.lr.ph281.prol.loopexit.unr-lcssa:                ; preds = %283, %.lr.ph281.prol
  %indvars.iv.next292.prol = add nsw i64 %indvars.iv291.ph, 1
  br label %.lr.ph281.prol.loopexit

.lr.ph281.prol.loopexit:                          ; preds = %.lr.ph281.prol.loopexit.unr-lcssa, %.lr.ph281.preheader328
  %indvars.iv291.unr = phi i64 [ %indvars.iv291.ph, %.lr.ph281.preheader328 ], [ %indvars.iv.next292.prol, %.lr.ph281.prol.loopexit.unr-lcssa ]
  %284 = add nsw i64 %wide.trip.count294, -1
  %285 = icmp eq i64 %indvars.iv291.ph, %284
  br i1 %285, label %.loopexit, label %.lr.ph281

.lr.ph281:                                        ; preds = %.lr.ph281.prol.loopexit, %300
  %indvars.iv291 = phi i64 [ %indvars.iv.next292.1, %300 ], [ %indvars.iv291.unr, %.lr.ph281.prol.loopexit ]
  %286 = getelementptr inbounds double, ptr %96, i64 %indvars.iv291
  %287 = load double, ptr %286, align 8, !tbaa !10
  %288 = getelementptr inbounds double, ptr %.0220, i64 %indvars.iv291
  %289 = load double, ptr %288, align 8, !tbaa !10
  %290 = fmul double %287, %289
  %291 = fcmp ult double %290, 0.000000e+00
  br i1 %291, label %.lr.ph281.1, label %292

292:                                              ; preds = %.lr.ph281
  store double 0.000000e+00, ptr %286, align 8, !tbaa !10
  br label %.lr.ph281.1

.lr.ph281.1:                                      ; preds = %.lr.ph281, %292
  %indvars.iv.next292 = add nsw i64 %indvars.iv291, 1
  %293 = getelementptr inbounds double, ptr %96, i64 %indvars.iv.next292
  %294 = load double, ptr %293, align 8, !tbaa !10
  %295 = getelementptr inbounds double, ptr %.0220, i64 %indvars.iv.next292
  %296 = load double, ptr %295, align 8, !tbaa !10
  %297 = fmul double %294, %296
  %298 = fcmp ult double %297, 0.000000e+00
  br i1 %298, label %300, label %299

299:                                              ; preds = %.lr.ph281.1
  store double 0.000000e+00, ptr %293, align 8, !tbaa !10
  br label %300

300:                                              ; preds = %299, %.lr.ph281.1
  %indvars.iv.next292.1 = add nsw i64 %indvars.iv291, 2
  %exitcond295.not.1 = icmp eq i64 %indvars.iv.next292.1, %wide.trip.count294
  br i1 %exitcond295.not.1, label %.loopexit, label %.lr.ph281, !llvm.loop !51

.loopexit:                                        ; preds = %.lr.ph281.prol.loopexit, %300, %middle.block, %254, %._crit_edge278
  store double 1.000000e+00, ptr %8, align 8, !tbaa !10
  br label %155

.loopexit264:                                     ; preds = %.lr.ph, %201, %193, %184, %172, %146, %110, %107, %90, %167
  %.0223 = phi i32 [ %.0225, %167 ], [ -1022, %90 ], [ -1022, %107 ], [ -1022, %110 ], [ 2, %146 ], [ -997, %201 ], [ 1, %193 ], [ 0, %184 ], [ %179, %172 ], [ -1022, %.lr.ph ]
  %.1221 = phi ptr [ %.0220, %167 ], [ null, %90 ], [ null, %107 ], [ %.0220, %110 ], [ %.0220, %146 ], [ %.0220, %172 ], [ %.0220, %184 ], [ %.0220, %193 ], [ %.0220, %201 ], [ %.0220, %.lr.ph ]
  %.1 = phi ptr [ %.0219, %167 ], [ null, %90 ], [ null, %107 ], [ null, %110 ], [ %.0219, %146 ], [ %.0219, %172 ], [ %.0219, %184 ], [ %.0219, %193 ], [ %.0219, %201 ], [ null, %.lr.ph ]
  %.0218 = phi ptr [ %113, %167 ], [ null, %90 ], [ null, %107 ], [ null, %110 ], [ %113, %146 ], [ %113, %172 ], [ %113, %184 ], [ %113, %193 ], [ %113, %201 ], [ %113, %.lr.ph ]
  %.not259 = icmp eq ptr %2, null
  br i1 %.not259, label %303, label %301

301:                                              ; preds = %.loopexit264
  %302 = load double, ptr %15, align 8, !tbaa !10
  store double %302, ptr %2, align 8, !tbaa !10
  br label %303

303:                                              ; preds = %301, %.loopexit264
  call void @vecfree(ptr noundef %.1)
  %.not260 = icmp eq ptr %.0218, null
  br i1 %.not260, label %310, label %.preheader

.preheader:                                       ; preds = %303
  %304 = icmp sgt i32 %20, 0
  br i1 %304, label %.lr.ph283.preheader, label %._crit_edge284

.lr.ph283.preheader:                              ; preds = %.preheader
  %wide.trip.count299 = zext nneg i32 %20 to i64
  br label %.lr.ph283

.lr.ph283:                                        ; preds = %.lr.ph283.preheader, %.lr.ph283
  %indvars.iv296 = phi i64 [ 0, %.lr.ph283.preheader ], [ %indvars.iv.next297, %.lr.ph283 ]
  %305 = getelementptr inbounds %struct.tag_iteration_data, ptr %.0218, i64 %indvars.iv296
  %306 = getelementptr inbounds i8, ptr %305, i64 8
  %307 = load ptr, ptr %306, align 8, !tbaa !37
  call void @vecfree(ptr noundef %307)
  %308 = getelementptr inbounds i8, ptr %305, i64 16
  %309 = load ptr, ptr %308, align 8, !tbaa !38
  call void @vecfree(ptr noundef %309)
  %indvars.iv.next297 = add nuw nsw i64 %indvars.iv296, 1
  %exitcond300.not = icmp eq i64 %indvars.iv.next297, %wide.trip.count299
  br i1 %exitcond300.not, label %._crit_edge284, label %.lr.ph283, !llvm.loop !52

._crit_edge284:                                   ; preds = %.lr.ph283, %.preheader
  call void @vecfree(ptr noundef nonnull %.0218)
  br label %310

310:                                              ; preds = %._crit_edge284, %303
  call void @vecfree(ptr noundef %.1221)
  call void @vecfree(ptr noundef %97)
  call void @vecfree(ptr noundef %96)
  call void @vecfree(ptr noundef %95)
  call void @vecfree(ptr noundef %94)
  call void @vecfree(ptr noundef %93)
  br label %311

311:                                              ; preds = %87, %86, %81, %74, %70, %66, %62, %58, %53, %45, %41, %37, %33, %29, %25, %19, %310
  %.0222 = phi i32 [ %.0223, %310 ], [ -1020, %19 ], [ -1017, %25 ], [ -1016, %29 ], [ -1015, %33 ], [ -1013, %37 ], [ -1012, %41 ], [ -1011, %45 ], [ -1010, %53 ], [ -1009, %58 ], [ -1008, %62 ], [ -1007, %66 ], [ -1006, %70 ], [ -1005, %74 ], [ -1004, %81 ], [ -1014, %86 ], [ -1014, %87 ]
  call void @llvm.lifetime.end.p0(i64 32, ptr nonnull %16) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %15) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %13) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %12) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %10) #6
  call void @llvm.lifetime.end.p0(i64 112, ptr nonnull %9) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %8) #6
  ret i32 %.0222
}

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

; Function Attrs: nounwind uwtable
declare hidden i32 @line_search_morethuente(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden i32 @line_search_backtracking_owlqn(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden i32 @line_search_backtracking(i32 noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden double @owlqn_x1norm(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

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

; Function Attrs: nounwind uwtable
declare hidden void @owlqn_pseudo_gradient(ptr noundef, ptr noundef, ptr noundef, i32 noundef, double noundef, i32 noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecncpy(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vec2norm(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vec2norminv(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @veccpy(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecdiff(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecdot(ptr noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecadd(ptr noundef, ptr noundef, double noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: inlinehint nounwind uwtable
declare hidden void @vecscale(ptr noundef, double noundef, i32 noundef) local_unnamed_addr #0

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smin.i32(i32, i32) #5

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


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