; LLVM IR from mkmarek/forex.analytics :: lib/ta-lib/src/ta_func (ta_SAR)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @TA_S_SAR(i32 noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef %3, double noundef %4, double noundef %5, ptr noundef %6, ptr noundef %7, ptr noundef %8) #2 {
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca double, align 8
  %16 = alloca double, align 8
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca double, align 8
  %26 = alloca double, align 8
  %27 = alloca double, align 8
  %28 = alloca double, align 8
  %29 = alloca double, align 8
  %30 = alloca double, align 8
  %31 = alloca double, align 8
  %32 = alloca [1 x double], align 8
  %33 = alloca i32, align 4
  store i32 %0, ptr %11, align 4, !tbaa !5
  store i32 %1, ptr %12, align 4, !tbaa !5
  store ptr %2, ptr %13, align 8, !tbaa !9
  store ptr %3, ptr %14, align 8, !tbaa !9
  store double %4, ptr %15, align 8, !tbaa !11
  store double %5, ptr %16, align 8, !tbaa !11
  store ptr %6, ptr %17, align 8, !tbaa !9
  store ptr %7, ptr %18, align 8, !tbaa !9
  store ptr %8, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #4
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #4
  %34 = load i32, ptr %11, align 4, !tbaa !5
  %35 = icmp slt i32 %34, 0
  br i1 %35, label %36, label %37

36:                                               ; preds = %9
  store i32 12, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

37:                                               ; preds = %9
  %38 = load i32, ptr %12, align 4, !tbaa !5
  %39 = icmp slt i32 %38, 0
  br i1 %39, label %44, label %40

40:                                               ; preds = %37
  %41 = load i32, ptr %12, align 4, !tbaa !5
  %42 = load i32, ptr %11, align 4, !tbaa !5
  %43 = icmp slt i32 %41, %42
  br i1 %43, label %44, label %45

44:                                               ; preds = %40, %37
  store i32 13, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

45:                                               ; preds = %40
  %46 = load ptr, ptr %13, align 8, !tbaa !9
  %47 = icmp ne ptr %46, null
  br i1 %47, label %48, label %51

48:                                               ; preds = %45
  %49 = load ptr, ptr %14, align 8, !tbaa !9
  %50 = icmp ne ptr %49, null
  br i1 %50, label %52, label %51

51:                                               ; preds = %48, %45
  store i32 2, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

52:                                               ; preds = %48
  %53 = load double, ptr %15, align 8, !tbaa !11
  %54 = fcmp oeq double %53, -4.000000e+37
  br i1 %54, label %55, label %56

55:                                               ; preds = %52
  store double 2.000000e-02, ptr %15, align 8, !tbaa !11
  br label %64

56:                                               ; preds = %52
  %57 = load double, ptr %15, align 8, !tbaa !11
  %58 = fcmp olt double %57, 0.000000e+00
  br i1 %58, label %62, label %59

59:                                               ; preds = %56
  %60 = load double, ptr %15, align 8, !tbaa !11
  %61 = fcmp ogt double %60, 3.000000e+37
  br i1 %61, label %62, label %63

62:                                               ; preds = %59, %56
  store i32 2, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

63:                                               ; preds = %59
  br label %64

64:                                               ; preds = %63, %55
  %65 = load double, ptr %16, align 8, !tbaa !11
  %66 = fcmp oeq double %65, -4.000000e+37
  br i1 %66, label %67, label %68

67:                                               ; preds = %64
  store double 2.000000e-01, ptr %16, align 8, !tbaa !11
  br label %76

68:                                               ; preds = %64
  %69 = load double, ptr %16, align 8, !tbaa !11
  %70 = fcmp olt double %69, 0.000000e+00
  br i1 %70, label %74, label %71

71:                                               ; preds = %68
  %72 = load double, ptr %16, align 8, !tbaa !11
  %73 = fcmp ogt double %72, 3.000000e+37
  br i1 %73, label %74, label %75

74:                                               ; preds = %71, %68
  store i32 2, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

75:                                               ; preds = %71
  br label %76

76:                                               ; preds = %75, %67
  %77 = load ptr, ptr %19, align 8, !tbaa !9
  %78 = icmp ne ptr %77, null
  br i1 %78, label %80, label %79

79:                                               ; preds = %76
  store i32 2, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

80:                                               ; preds = %76
  %81 = load i32, ptr %11, align 4, !tbaa !5
  %82 = icmp slt i32 %81, 1
  br i1 %82, label %83, label %84

83:                                               ; preds = %80
  store i32 1, ptr %11, align 4, !tbaa !5
  br label %84

84:                                               ; preds = %83, %80
  %85 = load i32, ptr %11, align 4, !tbaa !5
  %86 = load i32, ptr %12, align 4, !tbaa !5
  %87 = icmp sgt i32 %85, %86
  br i1 %87, label %88, label %91

88:                                               ; preds = %84
  %89 = load ptr, ptr %17, align 8, !tbaa !9
  store i32 0, ptr %89, align 4, !tbaa !5
  %90 = load ptr, ptr %18, align 8, !tbaa !9
  store i32 0, ptr %90, align 4, !tbaa !5
  store i32 0, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

91:                                               ; preds = %84
  %92 = load double, ptr %15, align 8, !tbaa !11
  store double %92, ptr %29, align 8, !tbaa !11
  %93 = load double, ptr %29, align 8, !tbaa !11
  %94 = load double, ptr %16, align 8, !tbaa !11
  %95 = fcmp ogt double %93, %94
  br i1 %95, label %96, label %98

96:                                               ; preds = %91
  %97 = load double, ptr %16, align 8, !tbaa !11
  store double %97, ptr %15, align 8, !tbaa !11
  store double %97, ptr %29, align 8, !tbaa !11
  br label %98

98:                                               ; preds = %96, %91
  %99 = load i32, ptr %11, align 4, !tbaa !5
  %100 = load i32, ptr %11, align 4, !tbaa !5
  %101 = load ptr, ptr %13, align 8, !tbaa !9
  %102 = load ptr, ptr %14, align 8, !tbaa !9
  %103 = getelementptr inbounds [1 x double], ptr %32, i64 0, i64 0
  %104 = call i32 @TA_S_MINUS_DM(i32 noundef %99, i32 noundef %100, ptr noundef %101, ptr noundef %102, i32 noundef 1, ptr noundef %24, ptr noundef %24, ptr noundef %103)
  store i32 %104, ptr %20, align 4, !tbaa !5
  %105 = getelementptr inbounds [1 x double], ptr %32, i64 0, i64 0
  %106 = load double, ptr %105, align 8, !tbaa !11
  %107 = fcmp ogt double %106, 0.000000e+00
  br i1 %107, label %108, label %109

108:                                              ; preds = %98
  store i32 0, ptr %21, align 4, !tbaa !5
  br label %110

109:                                              ; preds = %98
  store i32 1, ptr %21, align 4, !tbaa !5
  br label %110

110:                                              ; preds = %109, %108
  %111 = load i32, ptr %20, align 4, !tbaa !5
  %112 = icmp ne i32 %111, 0
  br i1 %112, label %113, label %117

113:                                              ; preds = %110
  %114 = load ptr, ptr %17, align 8, !tbaa !9
  store i32 0, ptr %114, align 4, !tbaa !5
  %115 = load ptr, ptr %18, align 8, !tbaa !9
  store i32 0, ptr %115, align 4, !tbaa !5
  %116 = load i32, ptr %20, align 4, !tbaa !5
  store i32 %116, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

117:                                              ; preds = %110
  %118 = load i32, ptr %11, align 4, !tbaa !5
  %119 = load ptr, ptr %17, align 8, !tbaa !9
  store i32 %118, ptr %119, align 4, !tbaa !5
  store i32 0, ptr %23, align 4, !tbaa !5
  %120 = load i32, ptr %11, align 4, !tbaa !5
  store i32 %120, ptr %22, align 4, !tbaa !5
  %121 = load ptr, ptr %13, align 8, !tbaa !9
  %122 = load i32, ptr %22, align 4, !tbaa !5
  %123 = sub nsw i32 %122, 1
  %124 = sext i32 %123 to i64
  %125 = getelementptr inbounds float, ptr %121, i64 %124
  %126 = load float, ptr %125, align 4, !tbaa !13
  %127 = fpext float %126 to double
  store double %127, ptr %25, align 8, !tbaa !11
  %128 = load ptr, ptr %14, align 8, !tbaa !9
  %129 = load i32, ptr %22, align 4, !tbaa !5
  %130 = sub nsw i32 %129, 1
  %131 = sext i32 %130 to i64
  %132 = getelementptr inbounds float, ptr %128, i64 %131
  %133 = load float, ptr %132, align 4, !tbaa !13
  %134 = fpext float %133 to double
  store double %134, ptr %26, align 8, !tbaa !11
  %135 = load i32, ptr %21, align 4, !tbaa !5
  %136 = icmp eq i32 %135, 1
  br i1 %136, label %137, label %145

137:                                              ; preds = %117
  %138 = load ptr, ptr %13, align 8, !tbaa !9
  %139 = load i32, ptr %22, align 4, !tbaa !5
  %140 = sext i32 %139 to i64
  %141 = getelementptr inbounds float, ptr %138, i64 %140
  %142 = load float, ptr %141, align 4, !tbaa !13
  %143 = fpext float %142 to double
  store double %143, ptr %30, align 8, !tbaa !11
  %144 = load double, ptr %26, align 8, !tbaa !11
  store double %144, ptr %31, align 8, !tbaa !11
  br label %153

145:                                              ; preds = %117
  %146 = load ptr, ptr %14, align 8, !tbaa !9
  %147 = load i32, ptr %22, align 4, !tbaa !5
  %148 = sext i32 %147 to i64
  %149 = getelementptr inbounds float, ptr %146, i64 %148
  %150 = load float, ptr %149, align 4, !tbaa !13
  %151 = fpext float %150 to double
  store double %151, ptr %30, align 8, !tbaa !11
  %152 = load double, ptr %25, align 8, !tbaa !11
  store double %152, ptr %31, align 8, !tbaa !11
  br label %153

153:                                              ; preds = %145, %137
  %154 = load ptr, ptr %14, align 8, !tbaa !9
  %155 = load i32, ptr %22, align 4, !tbaa !5
  %156 = sext i32 %155 to i64
  %157 = getelementptr inbounds float, ptr %154, i64 %156
  %158 = load float, ptr %157, align 4, !tbaa !13
  %159 = fpext float %158 to double
  store double %159, ptr %26, align 8, !tbaa !11
  %160 = load ptr, ptr %13, align 8, !tbaa !9
  %161 = load i32, ptr %22, align 4, !tbaa !5
  %162 = sext i32 %161 to i64
  %163 = getelementptr inbounds float, ptr %160, i64 %162
  %164 = load float, ptr %163, align 4, !tbaa !13
  %165 = fpext float %164 to double
  store double %165, ptr %25, align 8, !tbaa !11
  br label %166

166:                                              ; preds = %359, %153
  %167 = load i32, ptr %22, align 4, !tbaa !5
  %168 = load i32, ptr %12, align 4, !tbaa !5
  %169 = icmp sle i32 %167, %168
  br i1 %169, label %170, label %360

170:                                              ; preds = %166
  %171 = load double, ptr %26, align 8, !tbaa !11
  store double %171, ptr %28, align 8, !tbaa !11
  %172 = load double, ptr %25, align 8, !tbaa !11
  store double %172, ptr %27, align 8, !tbaa !11
  %173 = load ptr, ptr %14, align 8, !tbaa !9
  %174 = load i32, ptr %22, align 4, !tbaa !5
  %175 = sext i32 %174 to i64
  %176 = getelementptr inbounds float, ptr %173, i64 %175
  %177 = load float, ptr %176, align 4, !tbaa !13
  %178 = fpext float %177 to double
  store double %178, ptr %26, align 8, !tbaa !11
  %179 = load ptr, ptr %13, align 8, !tbaa !9
  %180 = load i32, ptr %22, align 4, !tbaa !5
  %181 = sext i32 %180 to i64
  %182 = getelementptr inbounds float, ptr %179, i64 %181
  %183 = load float, ptr %182, align 4, !tbaa !13
  %184 = fpext float %183 to double
  store double %184, ptr %25, align 8, !tbaa !11
  %185 = load i32, ptr %22, align 4, !tbaa !5
  %186 = add nsw i32 %185, 1
  store i32 %186, ptr %22, align 4, !tbaa !5
  %187 = load i32, ptr %21, align 4, !tbaa !5
  %188 = icmp eq i32 %187, 1
  br i1 %188, label %189, label %274

189:                                              ; preds = %170
  %190 = load double, ptr %26, align 8, !tbaa !11
  %191 = load double, ptr %31, align 8, !tbaa !11
  %192 = fcmp ole double %190, %191
  br i1 %192, label %193, label %233

193:                                              ; preds = %189
  store i32 0, ptr %21, align 4, !tbaa !5
  %194 = load double, ptr %30, align 8, !tbaa !11
  store double %194, ptr %31, align 8, !tbaa !11
  %195 = load double, ptr %31, align 8, !tbaa !11
  %196 = load double, ptr %27, align 8, !tbaa !11
  %197 = fcmp olt double %195, %196
  br i1 %197, label %198, label %200

198:                                              ; preds = %193
  %199 = load double, ptr %27, align 8, !tbaa !11
  store double %199, ptr %31, align 8, !tbaa !11
  br label %200

200:                                              ; preds = %198, %193
  %201 = load double, ptr %31, align 8, !tbaa !11
  %202 = load double, ptr %25, align 8, !tbaa !11
  %203 = fcmp olt double %201, %202
  br i1 %203, label %204, label %206

204:                                              ; preds = %200
  %205 = load double, ptr %25, align 8, !tbaa !11
  store double %205, ptr %31, align 8, !tbaa !11
  br label %206

206:                                              ; preds = %204, %200
  %207 = load double, ptr %31, align 8, !tbaa !11
  %208 = load ptr, ptr %19, align 8, !tbaa !9
  %209 = load i32, ptr %23, align 4, !tbaa !5
  %210 = add nsw i32 %209, 1
  store i32 %210, ptr %23, align 4, !tbaa !5
  %211 = sext i32 %209 to i64
  %212 = getelementptr inbounds double, ptr %208, i64 %211
  store double %207, ptr %212, align 8, !tbaa !11
  %213 = load double, ptr %15, align 8, !tbaa !11
  store double %213, ptr %29, align 8, !tbaa !11
  %214 = load double, ptr %26, align 8, !tbaa !11
  store double %214, ptr %30, align 8, !tbaa !11
  %215 = load double, ptr %31, align 8, !tbaa !11
  %216 = load double, ptr %29, align 8, !tbaa !11
  %217 = load double, ptr %30, align 8, !tbaa !11
  %218 = load double, ptr %31, align 8, !tbaa !11
  %219 = fsub double %217, %218
  %220 = call double @llvm.fmuladd.f64(double %216, double %219, double %215)
  store double %220, ptr %31, align 8, !tbaa !11
  %221 = load double, ptr %31, align 8, !tbaa !11
  %222 = load double, ptr %27, align 8, !tbaa !11
  %223 = fcmp olt double %221, %222
  br i1 %223, label %224, label %226

224:                                              ; preds = %206
  %225 = load double, ptr %27, align 8, !tbaa !11
  store double %225, ptr %31, align 8, !tbaa !11
  br label %226

226:                                              ; preds = %224, %206
  %227 = load double, ptr %31, align 8, !tbaa !11
  %228 = load double, ptr %25, align 8, !tbaa !11
  %229 = fcmp olt double %227, %228
  br i1 %229, label %230, label %232

230:                                              ; preds = %226
  %231 = load double, ptr %25, align 8, !tbaa !11
  store double %231, ptr %31, align 8, !tbaa !11
  br label %232

232:                                              ; preds = %230, %226
  br label %273

233:                                              ; preds = %189
  %234 = load double, ptr %31, align 8, !tbaa !11
  %235 = load ptr, ptr %19, align 8, !tbaa !9
  %236 = load i32, ptr %23, align 4, !tbaa !5
  %237 = add nsw i32 %236, 1
  store i32 %237, ptr %23, align 4, !tbaa !5
  %238 = sext i32 %236 to i64
  %239 = getelementptr inbounds double, ptr %235, i64 %238
  store double %234, ptr %239, align 8, !tbaa !11
  %240 = load double, ptr %25, align 8, !tbaa !11
  %241 = load double, ptr %30, align 8, !tbaa !11
  %242 = fcmp ogt double %240, %241
  br i1 %242, label %243, label %254

243:                                              ; preds = %233
  %244 = load double, ptr %25, align 8, !tbaa !11
  store double %244, ptr %30, align 8, !tbaa !11
  %245 = load double, ptr %15, align 8, !tbaa !11
  %246 = load double, ptr %29, align 8, !tbaa !11
  %247 = fadd double %246, %245
  store double %247, ptr %29, align 8, !tbaa !11
  %248 = load double, ptr %29, align 8, !tbaa !11
  %249 = load double, ptr %16, align 8, !tbaa !11
  %250 = fcmp ogt double %248, %249
  br i1 %250, label %251, label %253

251:                                              ; preds = %243
  %252 = load double, ptr %16, align 8, !tbaa !11
  store double %252, ptr %29, align 8, !tbaa !11
  br label %253

253:                                              ; preds = %251, %243
  br label %254

254:                                              ; preds = %253, %233
  %255 = load double, ptr %31, align 8, !tbaa !11
  %256 = load double, ptr %29, align 8, !tbaa !11
  %257 = load double, ptr %30, align 8, !tbaa !11
  %258 = load double, ptr %31, align 8, !tbaa !11
  %259 = fsub double %257, %258
  %260 = call double @llvm.fmuladd.f64(double %256, double %259, double %255)
  store double %260, ptr %31, align 8, !tbaa !11
  %261 = load double, ptr %31, align 8, !tbaa !11
  %262 = load double, ptr %28, align 8, !tbaa !11
  %263 = fcmp ogt double %261, %262
  br i1 %263, label %264, label %266

264:                                              ; preds = %254
  %265 = load double, ptr %28, align 8, !tbaa !11
  store double %265, ptr %31, align 8, !tbaa !11
  br label %266

266:                                              ; preds = %264, %254
  %267 = load double, ptr %31, align 8, !tbaa !11
  %268 = load double, ptr %26, align 8, !tbaa !11
  %269 = fcmp ogt double %267, %268
  br i1 %269, label %270, label %272

270:                                              ; preds = %266
  %271 = load double, ptr %26, align 8, !tbaa !11
  store double %271, ptr %31, align 8, !tbaa !11
  br label %272

272:                                              ; preds = %270, %266
  br label %273

273:                                              ; preds = %272, %232
  br label %359

274:                                              ; preds = %170
  %275 = load double, ptr %25, align 8, !tbaa !11
  %276 = load double, ptr %31, align 8, !tbaa !11
  %277 = fcmp oge double %275, %276
  br i1 %277, label %278, label %318

278:                                              ; preds = %274
  store i32 1, ptr %21, align 4, !tbaa !5
  %279 = load double, ptr %30, align 8, !tbaa !11
  store double %279, ptr %31, align 8, !tbaa !11
  %280 = load double, ptr %31, align 8, !tbaa !11
  %281 = load double, ptr %28, align 8, !tbaa !11
  %282 = fcmp ogt double %280, %281
  br i1 %282, label %283, label %285

283:                                              ; preds = %278
  %284 = load double, ptr %28, align 8, !tbaa !11
  store double %284, ptr %31, align 8, !tbaa !11
  br label %285

285:                                              ; preds = %283, %278
  %286 = load double, ptr %31, align 8, !tbaa !11
  %287 = load double, ptr %26, align 8, !tbaa !11
  %288 = fcmp ogt double %286, %287
  br i1 %288, label %289, label %291

289:                                              ; preds = %285
  %290 = load double, ptr %26, align 8, !tbaa !11
  store double %290, ptr %31, align 8, !tbaa !11
  br label %291

291:                                              ; preds = %289, %285
  %292 = load double, ptr %31, align 8, !tbaa !11
  %293 = load ptr, ptr %19, align 8, !tbaa !9
  %294 = load i32, ptr %23, align 4, !tbaa !5
  %295 = add nsw i32 %294, 1
  store i32 %295, ptr %23, align 4, !tbaa !5
  %296 = sext i32 %294 to i64
  %297 = getelementptr inbounds double, ptr %293, i64 %296
  store double %292, ptr %297, align 8, !tbaa !11
  %298 = load double, ptr %15, align 8, !tbaa !11
  store double %298, ptr %29, align 8, !tbaa !11
  %299 = load double, ptr %25, align 8, !tbaa !11
  store double %299, ptr %30, align 8, !tbaa !11
  %300 = load double, ptr %31, align 8, !tbaa !11
  %301 = load double, ptr %29, align 8, !tbaa !11
  %302 = load double, ptr %30, align 8, !tbaa !11
  %303 = load double, ptr %31, align 8, !tbaa !11
  %304 = fsub double %302, %303
  %305 = call double @llvm.fmuladd.f64(double %301, double %304, double %300)
  store double %305, ptr %31, align 8, !tbaa !11
  %306 = load double, ptr %31, align 8, !tbaa !11
  %307 = load double, ptr %28, align 8, !tbaa !11
  %308 = fcmp ogt double %306, %307
  br i1 %308, label %309, label %311

309:                                              ; preds = %291
  %310 = load double, ptr %28, align 8, !tbaa !11
  store double %310, ptr %31, align 8, !tbaa !11
  br label %311

311:                                              ; preds = %309, %291
  %312 = load double, ptr %31, align 8, !tbaa !11
  %313 = load double, ptr %26, align 8, !tbaa !11
  %314 = fcmp ogt double %312, %313
  br i1 %314, label %315, label %317

315:                                              ; preds = %311
  %316 = load double, ptr %26, align 8, !tbaa !11
  store double %316, ptr %31, align 8, !tbaa !11
  br label %317

317:                                              ; preds = %315, %311
  br label %358

318:                                              ; preds = %274
  %319 = load double, ptr %31, align 8, !tbaa !11
  %320 = load ptr, ptr %19, align 8, !tbaa !9
  %321 = load i32, ptr %23, align 4, !tbaa !5
  %322 = add nsw i32 %321, 1
  store i32 %322, ptr %23, align 4, !tbaa !5
  %323 = sext i32 %321 to i64
  %324 = getelementptr inbounds double, ptr %320, i64 %323
  store double %319, ptr %324, align 8, !tbaa !11
  %325 = load double, ptr %26, align 8, !tbaa !11
  %326 = load double, ptr %30, align 8, !tbaa !11
  %327 = fcmp olt double %325, %326
  br i1 %327, label %328, label %339

328:                                              ; preds = %318
  %329 = load double, ptr %26, align 8, !tbaa !11
  store double %329, ptr %30, align 8, !tbaa !11
  %330 = load double, ptr %15, align 8, !tbaa !11
  %331 = load double, ptr %29, align 8, !tbaa !11
  %332 = fadd double %331, %330
  store double %332, ptr %29, align 8, !tbaa !11
  %333 = load double, ptr %29, align 8, !tbaa !11
  %334 = load double, ptr %16, align 8, !tbaa !11
  %335 = fcmp ogt double %333, %334
  br i1 %335, label %336, label %338

336:                                              ; preds = %328
  %337 = load double, ptr %16, align 8, !tbaa !11
  store double %337, ptr %29, align 8, !tbaa !11
  br label %338

338:                                              ; preds = %336, %328
  br label %339

339:                                              ; preds = %338, %318
  %340 = load double, ptr %31, align 8, !tbaa !11
  %341 = load double, ptr %29, align 8, !tbaa !11
  %342 = load double, ptr %30, align 8, !tbaa !11
  %343 = load double, ptr %31, align 8, !tbaa !11
  %344 = fsub double %342, %343
  %345 = call double @llvm.fmuladd.f64(double %341, double %344, double %340)
  store double %345, ptr %31, align 8, !tbaa !11
  %346 = load double, ptr %31, align 8, !tbaa !11
  %347 = load double, ptr %27, align 8, !tbaa !11
  %348 = fcmp olt double %346, %347
  br i1 %348, label %349, label %351

349:                                              ; preds = %339
  %350 = load double, ptr %27, align 8, !tbaa !11
  store double %350, ptr %31, align 8, !tbaa !11
  br label %351

351:                                              ; preds = %349, %339
  %352 = load double, ptr %31, align 8, !tbaa !11
  %353 = load double, ptr %25, align 8, !tbaa !11
  %354 = fcmp olt double %352, %353
  br i1 %354, label %355, label %357

355:                                              ; preds = %351
  %356 = load double, ptr %25, align 8, !tbaa !11
  store double %356, ptr %31, align 8, !tbaa !11
  br label %357

357:                                              ; preds = %355, %351
  br label %358

358:                                              ; preds = %357, %317
  br label %359

359:                                              ; preds = %358, %273
  br label %166, !llvm.loop !15

360:                                              ; preds = %166
  %361 = load i32, ptr %23, align 4, !tbaa !5
  %362 = load ptr, ptr %18, align 8, !tbaa !9
  store i32 %361, ptr %362, align 4, !tbaa !5
  store i32 0, ptr %10, align 4
  store i32 1, ptr %33, align 4
  br label %363

363:                                              ; preds = %360, %113, %88, %79, %74, %62, %51, %44, %36
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #4
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #4
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #4
  %364 = load i32, ptr %10, align 4
  ret i32 %364
}

declare i32 @TA_S_MINUS_DM(i32 noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) #3

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"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 = !{!12, !12, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!14, !14, i64 0}
!14 = !{!"float", !7, i64 0}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}


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

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

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

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

; Function Attrs: nounwind uwtable
define dso_local i32 @TA_S_SAR(i32 noundef %0, i32 noundef %1, ptr noundef %2, ptr noundef %3, double noundef %4, double noundef %5, ptr nocapture noundef writeonly %6, ptr nocapture noundef writeonly %7, ptr noundef writeonly %8) local_unnamed_addr #2 {
  %10 = alloca i32, align 4
  %11 = alloca [1 x double], align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %10) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %11) #5
  %12 = icmp slt i32 %0, 0
  br i1 %12, label %105, label %13

13:                                               ; preds = %9
  %14 = icmp slt i32 %1, %0
  br i1 %14, label %105, label %15

15:                                               ; preds = %13
  %16 = icmp ne ptr %2, null
  %17 = icmp ne ptr %3, null
  %or.cond = and i1 %16, %17
  br i1 %or.cond, label %18, label %105

18:                                               ; preds = %15
  %19 = fcmp oeq double %4, -4.000000e+37
  br i1 %19, label %23, label %20

20:                                               ; preds = %18
  %21 = fcmp olt double %4, 0.000000e+00
  %22 = fcmp ogt double %4, 3.000000e+37
  %or.cond3 = or i1 %21, %22
  br i1 %or.cond3, label %105, label %23

23:                                               ; preds = %18, %20
  %.0174 = phi double [ %4, %20 ], [ 2.000000e-02, %18 ]
  %24 = fcmp oeq double %5, -4.000000e+37
  br i1 %24, label %28, label %25

25:                                               ; preds = %23
  %26 = fcmp olt double %5, 0.000000e+00
  %27 = fcmp ogt double %5, 3.000000e+37
  %or.cond5 = or i1 %26, %27
  br i1 %or.cond5, label %105, label %28

28:                                               ; preds = %23, %25
  %.0176 = phi double [ %5, %25 ], [ 2.000000e-01, %23 ]
  %.not = icmp eq ptr %8, null
  br i1 %.not, label %105, label %29

29:                                               ; preds = %28
  %30 = tail call i32 @llvm.umax.i32(i32 %0, i32 1)
  %31 = icmp ugt i32 %30, %1
  br i1 %31, label %.sink.split.sink.split, label %32

32:                                               ; preds = %29
  %33 = fcmp ogt double %.0174, %.0176
  %.0160 = select i1 %33, double %.0176, double %.0174
  %34 = call i32 @TA_S_MINUS_DM(i32 noundef %30, i32 noundef %30, ptr noundef nonnull %2, ptr noundef nonnull %3, i32 noundef 1, ptr noundef nonnull %10, ptr noundef nonnull %10, ptr noundef nonnull %11) #5
  %.not201 = icmp eq i32 %34, 0
  br i1 %.not201, label %35, label %.sink.split.sink.split

35:                                               ; preds = %32
  %36 = load double, ptr %11, align 8, !tbaa !5
  store i32 %30, ptr %6, align 4, !tbaa !9
  %.not202204 = icmp ugt i32 %30, %1
  br i1 %.not202204, label %.sink.split, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %35
  %37 = zext nneg i32 %30 to i64
  %38 = getelementptr inbounds float, ptr %2, i64 %37
  %39 = load float, ptr %38, align 4
  %40 = fpext float %39 to double
  %41 = getelementptr inbounds float, ptr %3, i64 %37
  %42 = load float, ptr %41, align 4
  %43 = fpext float %42 to double
  %44 = fcmp ule double %36, 0.000000e+00
  %.0155.in = select i1 %44, float %39, float %42
  %.0155 = fpext float %.0155.in to double
  %.pn = select i1 %44, ptr %3, ptr %2
  %45 = getelementptr float, ptr %.pn, i64 %37
  %.0.in.in = getelementptr i8, ptr %45, i64 -4
  %.0.in = load float, ptr %.0.in.in, align 4, !tbaa !11
  %.0 = fpext float %.0.in to double
  %.0171 = zext i1 %44 to i32
  %46 = call i32 @llvm.umax.i32(i32 %0, i32 1)
  %umax = zext nneg i32 %46 to i64
  %47 = add nuw i32 %1, 1
  %48 = sub i32 %47, %30
  %wide.trip.count = zext i32 %48 to i64
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %104
  %indvars.iv213 = phi i64 [ %umax, %.lr.ph.preheader ], [ %indvars.iv.next214, %104 ]
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %104 ]
  %.1212 = phi double [ %.0, %.lr.ph.preheader ], [ %.10, %104 ]
  %.1156211 = phi double [ %.0155, %.lr.ph.preheader ], [ %.4159, %104 ]
  %.1161210 = phi double [ %.0160, %.lr.ph.preheader ], [ %.4164, %104 ]
  %.0166209 = phi double [ %43, %.lr.ph.preheader ], [ %51, %104 ]
  %.0167208 = phi double [ %40, %.lr.ph.preheader ], [ %54, %104 ]
  %.1172205 = phi i32 [ %.0171, %.lr.ph.preheader ], [ %.2173, %104 ]
  %49 = getelementptr inbounds float, ptr %3, i64 %indvars.iv213
  %50 = load float, ptr %49, align 4, !tbaa !11
  %51 = fpext float %50 to double
  %52 = getelementptr inbounds float, ptr %2, i64 %indvars.iv213
  %53 = load float, ptr %52, align 4, !tbaa !11
  %54 = fpext float %53 to double
  %indvars.iv.next214 = add nuw nsw i64 %indvars.iv213, 1
  %55 = icmp eq i32 %.1172205, 1
  br i1 %55, label %56, label %80

56:                                               ; preds = %.lr.ph
  %57 = fcmp ult double %.1212, %51
  br i1 %57, label %67, label %58

58:                                               ; preds = %56
  %59 = fcmp olt double %.1156211, %.0167208
  %.2 = select i1 %59, double %.0167208, double %.1156211
  %60 = fcmp olt double %.2, %54
  %.3 = select i1 %60, double %54, double %.2
  %61 = getelementptr inbounds double, ptr %8, i64 %indvars.iv
  store double %.3, ptr %61, align 8, !tbaa !5
  %62 = fsub double %51, %.3
  %63 = call double @llvm.fmuladd.f64(double %.0160, double %62, double %.3)
  %64 = fcmp olt double %63, %.0167208
  %.4 = select i1 %64, double %.0167208, double %63
  %65 = fcmp olt double %.4, %54
  br i1 %65, label %66, label %104

66:                                               ; preds = %58
  br label %104

67:                                               ; preds = %56
  %68 = getelementptr inbounds double, ptr %8, i64 %indvars.iv
  store double %.1212, ptr %68, align 8, !tbaa !5
  %69 = fcmp olt double %.1156211, %54
  br i1 %69, label %70, label %74

70:                                               ; preds = %67
  %71 = fadd double %.0160, %.1161210
  %72 = fcmp ogt double %71, %.0176
  br i1 %72, label %73, label %74

73:                                               ; preds = %70
  br label %74

74:                                               ; preds = %70, %73, %67
  %.2162 = phi double [ %.0176, %73 ], [ %71, %70 ], [ %.1161210, %67 ]
  %.2157 = phi double [ %54, %73 ], [ %54, %70 ], [ %.1156211, %67 ]
  %75 = fsub double %.2157, %.1212
  %76 = call double @llvm.fmuladd.f64(double %.2162, double %75, double %.1212)
  %77 = fcmp ogt double %76, %.0166209
  %.5 = select i1 %77, double %.0166209, double %76
  %78 = fcmp ogt double %.5, %51
  br i1 %78, label %79, label %104

79:                                               ; preds = %74
  br label %104

80:                                               ; preds = %.lr.ph
  %81 = fcmp ugt double %.1212, %54
  br i1 %81, label %91, label %82

82:                                               ; preds = %80
  %83 = fcmp ogt double %.1156211, %.0166209
  %.6 = select i1 %83, double %.0166209, double %.1156211
  %84 = fcmp ogt double %.6, %51
  %.7 = select i1 %84, double %51, double %.6
  %85 = getelementptr inbounds double, ptr %8, i64 %indvars.iv
  store double %.7, ptr %85, align 8, !tbaa !5
  %86 = fsub double %54, %.7
  %87 = call double @llvm.fmuladd.f64(double %.0160, double %86, double %.7)
  %88 = fcmp ogt double %87, %.0166209
  %.8 = select i1 %88, double %.0166209, double %87
  %89 = fcmp ogt double %.8, %51
  br i1 %89, label %90, label %104

90:                                               ; preds = %82
  br label %104

91:                                               ; preds = %80
  %92 = getelementptr inbounds double, ptr %8, i64 %indvars.iv
  store double %.1212, ptr %92, align 8, !tbaa !5
  %93 = fcmp ogt double %.1156211, %51
  br i1 %93, label %94, label %98

94:                                               ; preds = %91
  %95 = fadd double %.0160, %.1161210
  %96 = fcmp ogt double %95, %.0176
  br i1 %96, label %97, label %98

97:                                               ; preds = %94
  br label %98

98:                                               ; preds = %94, %97, %91
  %.3163 = phi double [ %.0176, %97 ], [ %95, %94 ], [ %.1161210, %91 ]
  %.3158 = phi double [ %51, %97 ], [ %51, %94 ], [ %.1156211, %91 ]
  %99 = fsub double %.3158, %.1212
  %100 = call double @llvm.fmuladd.f64(double %.3163, double %99, double %.1212)
  %101 = fcmp olt double %100, %.0167208
  %.9 = select i1 %101, double %.0167208, double %100
  %102 = fcmp olt double %.9, %54
  br i1 %102, label %103, label %104

103:                                              ; preds = %98
  br label %104

104:                                              ; preds = %90, %82, %103, %98, %66, %58, %79, %74
  %.2173 = phi i32 [ 0, %66 ], [ 0, %58 ], [ 1, %79 ], [ 1, %74 ], [ 1, %90 ], [ 1, %82 ], [ 0, %103 ], [ 0, %98 ]
  %.4164 = phi double [ %.0160, %66 ], [ %.0160, %58 ], [ %.2162, %79 ], [ %.2162, %74 ], [ %.0160, %90 ], [ %.0160, %82 ], [ %.3163, %103 ], [ %.3163, %98 ]
  %.4159 = phi double [ %51, %66 ], [ %51, %58 ], [ %.2157, %79 ], [ %.2157, %74 ], [ %54, %90 ], [ %54, %82 ], [ %.3158, %103 ], [ %.3158, %98 ]
  %.10 = phi double [ %54, %66 ], [ %.4, %58 ], [ %51, %79 ], [ %.5, %74 ], [ %51, %90 ], [ %.8, %82 ], [ %54, %103 ], [ %.9, %98 ]
  %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 %.sink.split, label %.lr.ph, !llvm.loop !13

.sink.split.sink.split:                           ; preds = %32, %29
  %.0165.ph.ph = phi i32 [ 0, %29 ], [ %34, %32 ]
  store i32 0, ptr %6, align 4, !tbaa !9
  br label %.sink.split

.sink.split:                                      ; preds = %104, %.sink.split.sink.split, %35
  %.0168.lcssa.sink = phi i32 [ 0, %35 ], [ 0, %.sink.split.sink.split ], [ %48, %104 ]
  %.0165.ph = phi i32 [ 0, %35 ], [ %.0165.ph.ph, %.sink.split.sink.split ], [ 0, %104 ]
  store i32 %.0168.lcssa.sink, ptr %7, align 4, !tbaa !9
  br label %105

105:                                              ; preds = %.sink.split, %28, %25, %20, %15, %13, %9
  %.0165 = phi i32 [ 12, %9 ], [ 13, %13 ], [ 2, %15 ], [ 2, %20 ], [ 2, %25 ], [ 2, %28 ], [ %.0165.ph, %.sink.split ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %11) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %10) #5
  ret i32 %.0165
}

declare i32 @TA_S_MINUS_DM(i32 noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #3

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

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

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

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


; Effective O3 passes: ConstraintEliminationPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LCSSAPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass