; LLVM IR from jgaeddert/liquid-dsp :: src/filter/src (firdespm)

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

@.str = external hidden unnamed_addr constant [80 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [54 x i8], align 1

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

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

declare i32 @liquid_error_fl(i32 noundef, ptr noundef, i32 noundef, ptr noundef, ...) #1

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

; Function Attrs: nounwind uwtable
define dso_local i32 @firdespm_init_grid(ptr noundef %0) #3 {
  %2 = alloca i32, align 4
  %3 = alloca ptr, align 8
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca double, align 8
  %7 = alloca i32, align 4
  %8 = alloca double, align 8
  %9 = alloca double, align 8
  %10 = alloca double, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  store ptr %0, ptr %3, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %5) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #5
  %13 = load ptr, ptr %3, align 8, !tbaa !5
  %14 = getelementptr inbounds %struct.firdespm_s, ptr %13, i32 0, i32 6
  %15 = load i32, ptr %14, align 8, !tbaa !9
  %16 = load ptr, ptr %3, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.firdespm_s, ptr %16, i32 0, i32 3
  %18 = load i32, ptr %17, align 4, !tbaa !13
  %19 = mul i32 %15, %18
  %20 = uitofp i32 %19 to double
  %21 = fdiv double 5.000000e-01, %20
  store double %21, ptr %6, align 8, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #5
  store i32 0, ptr %7, align 4, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  store double 1.000000e+00, ptr %10, align 8, !tbaa !14
  store i32 0, ptr %4, align 4, !tbaa !15
  br label %22

22:                                               ; preds = %205, %1
  %23 = load i32, ptr %4, align 4, !tbaa !15
  %24 = load ptr, ptr %3, align 8, !tbaa !5
  %25 = getelementptr inbounds %struct.firdespm_s, ptr %24, i32 0, i32 4
  %26 = load i32, ptr %25, align 8, !tbaa !16
  %27 = icmp ult i32 %23, %26
  br i1 %27, label %28, label %208

28:                                               ; preds = %22
  %29 = load ptr, ptr %3, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.firdespm_s, ptr %29, i32 0, i32 8
  %31 = load ptr, ptr %30, align 8, !tbaa !17
  %32 = load i32, ptr %4, align 4, !tbaa !15
  %33 = mul i32 2, %32
  %34 = add i32 %33, 0
  %35 = zext i32 %34 to i64
  %36 = getelementptr inbounds double, ptr %31, i64 %35
  %37 = load double, ptr %36, align 8, !tbaa !14
  store double %37, ptr %8, align 8, !tbaa !14
  %38 = load ptr, ptr %3, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.firdespm_s, ptr %38, i32 0, i32 8
  %40 = load ptr, ptr %39, align 8, !tbaa !17
  %41 = load i32, ptr %4, align 4, !tbaa !15
  %42 = mul i32 2, %41
  %43 = add i32 %42, 1
  %44 = zext i32 %43 to i64
  %45 = getelementptr inbounds double, ptr %40, i64 %44
  %46 = load double, ptr %45, align 8, !tbaa !14
  store double %46, ptr %9, align 8, !tbaa !14
  %47 = load i32, ptr %4, align 4, !tbaa !15
  %48 = icmp eq i32 %47, 0
  br i1 %48, label %49, label %64

49:                                               ; preds = %28
  %50 = load ptr, ptr %3, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.firdespm_s, ptr %50, i32 0, i32 7
  %52 = load i32, ptr %51, align 4, !tbaa !18
  %53 = icmp ne i32 %52, 0
  br i1 %53, label %54, label %64

54:                                               ; preds = %49
  %55 = load double, ptr %8, align 8, !tbaa !14
  %56 = load double, ptr %6, align 8, !tbaa !14
  %57 = fcmp olt double %55, %56
  br i1 %57, label %58, label %60

58:                                               ; preds = %54
  %59 = load double, ptr %6, align 8, !tbaa !14
  br label %62

60:                                               ; preds = %54
  %61 = load double, ptr %8, align 8, !tbaa !14
  br label %62

62:                                               ; preds = %60, %58
  %63 = phi double [ %59, %58 ], [ %61, %60 ]
  store double %63, ptr %8, align 8, !tbaa !14
  br label %64

64:                                               ; preds = %62, %49, %28
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #5
  %65 = load double, ptr %9, align 8, !tbaa !14
  %66 = load double, ptr %8, align 8, !tbaa !14
  %67 = fsub double %65, %66
  %68 = load double, ptr %6, align 8, !tbaa !14
  %69 = fdiv double %67, %68
  %70 = fadd double %69, 5.000000e-01
  %71 = fptoui double %70 to i32
  store i32 %71, ptr %11, align 4, !tbaa !15
  %72 = load i32, ptr %11, align 4, !tbaa !15
  %73 = icmp ult i32 %72, 1
  br i1 %73, label %74, label %75

74:                                               ; preds = %64
  store i32 1, ptr %11, align 4, !tbaa !15
  br label %75

75:                                               ; preds = %74, %64
  store i32 0, ptr %5, align 4, !tbaa !15
  br label %76

76:                                               ; preds = %190, %75
  %77 = load i32, ptr %5, align 4, !tbaa !15
  %78 = load i32, ptr %11, align 4, !tbaa !15
  %79 = icmp ult i32 %77, %78
  br i1 %79, label %80, label %193

80:                                               ; preds = %76
  %81 = load double, ptr %8, align 8, !tbaa !14
  %82 = load i32, ptr %5, align 4, !tbaa !15
  %83 = uitofp i32 %82 to double
  %84 = load double, ptr %6, align 8, !tbaa !14
  %85 = call double @llvm.fmuladd.f64(double %83, double %84, double %81)
  %86 = load ptr, ptr %3, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.firdespm_s, ptr %86, i32 0, i32 12
  %88 = load ptr, ptr %87, align 8, !tbaa !19
  %89 = load i32, ptr %7, align 4, !tbaa !15
  %90 = zext i32 %89 to i64
  %91 = getelementptr inbounds double, ptr %88, i64 %90
  store double %85, ptr %91, align 8, !tbaa !14
  %92 = load ptr, ptr %3, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.firdespm_s, ptr %92, i32 0, i32 22
  %94 = load ptr, ptr %93, align 8, !tbaa !20
  %95 = icmp ne ptr %94, null
  br i1 %95, label %96, label %123

96:                                               ; preds = %80
  %97 = load ptr, ptr %3, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.firdespm_s, ptr %97, i32 0, i32 22
  %99 = load ptr, ptr %98, align 8, !tbaa !20
  %100 = load ptr, ptr %3, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.firdespm_s, ptr %100, i32 0, i32 12
  %102 = load ptr, ptr %101, align 8, !tbaa !19
  %103 = load i32, ptr %7, align 4, !tbaa !15
  %104 = zext i32 %103 to i64
  %105 = getelementptr inbounds double, ptr %102, i64 %104
  %106 = load double, ptr %105, align 8, !tbaa !14
  %107 = load ptr, ptr %3, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.firdespm_s, ptr %107, i32 0, i32 23
  %109 = load ptr, ptr %108, align 8, !tbaa !21
  %110 = load ptr, ptr %3, align 8, !tbaa !5
  %111 = getelementptr inbounds %struct.firdespm_s, ptr %110, i32 0, i32 13
  %112 = load ptr, ptr %111, align 8, !tbaa !22
  %113 = load i32, ptr %7, align 4, !tbaa !15
  %114 = zext i32 %113 to i64
  %115 = getelementptr inbounds double, ptr %112, i64 %114
  %116 = load ptr, ptr %3, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.firdespm_s, ptr %116, i32 0, i32 14
  %118 = load ptr, ptr %117, align 8, !tbaa !23
  %119 = load i32, ptr %7, align 4, !tbaa !15
  %120 = zext i32 %119 to i64
  %121 = getelementptr inbounds double, ptr %118, i64 %120
  %122 = call i32 %99(double noundef %106, ptr noundef %109, ptr noundef %115, ptr noundef %121)
  br label %187

123:                                              ; preds = %80
  %124 = load ptr, ptr %3, align 8, !tbaa !5
  %125 = getelementptr inbounds %struct.firdespm_s, ptr %124, i32 0, i32 9
  %126 = load ptr, ptr %125, align 8, !tbaa !24
  %127 = load i32, ptr %4, align 4, !tbaa !15
  %128 = zext i32 %127 to i64
  %129 = getelementptr inbounds double, ptr %126, i64 %128
  %130 = load double, ptr %129, align 8, !tbaa !14
  %131 = load ptr, ptr %3, align 8, !tbaa !5
  %132 = getelementptr inbounds %struct.firdespm_s, ptr %131, i32 0, i32 13
  %133 = load ptr, ptr %132, align 8, !tbaa !22
  %134 = load i32, ptr %7, align 4, !tbaa !15
  %135 = zext i32 %134 to i64
  %136 = getelementptr inbounds double, ptr %133, i64 %135
  store double %130, ptr %136, align 8, !tbaa !14
  %137 = load ptr, ptr %3, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.firdespm_s, ptr %137, i32 0, i32 11
  %139 = load ptr, ptr %138, align 8, !tbaa !25
  %140 = load i32, ptr %4, align 4, !tbaa !15
  %141 = zext i32 %140 to i64
  %142 = getelementptr inbounds i32, ptr %139, i64 %141
  %143 = load i32, ptr %142, align 4, !tbaa !15
  switch i32 %143, label %162 [
    i32 0, label %144
    i32 1, label %145
    i32 2, label %155
  ]

144:                                              ; preds = %123
  store double 1.000000e+00, ptr %10, align 8, !tbaa !14
  br label %171

145:                                              ; preds = %123
  %146 = load i32, ptr %5, align 4, !tbaa !15
  %147 = uitofp i32 %146 to float
  %148 = fmul float 2.000000e+00, %147
  %149 = fpext float %148 to double
  %150 = load double, ptr %6, align 8, !tbaa !14
  %151 = fmul double %149, %150
  %152 = fptrunc double %151 to float
  %153 = call float @expf(float noundef %152) #5, !tbaa !15
  %154 = fpext float %153 to double
  store double %154, ptr %10, align 8, !tbaa !14
  br label %171

155:                                              ; preds = %123
  %156 = load i32, ptr %5, align 4, !tbaa !15
  %157 = uitofp i32 %156 to float
  %158 = fmul float 0x40059999A0000000, %157
  %159 = fpext float %158 to double
  %160 = load double, ptr %6, align 8, !tbaa !14
  %161 = call double @llvm.fmuladd.f64(double %159, double %160, double 1.000000e+00)
  store double %161, ptr %10, align 8, !tbaa !14
  br label %171

162:                                              ; preds = %123
  %163 = load ptr, ptr %3, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.firdespm_s, ptr %163, i32 0, i32 11
  %165 = load ptr, ptr %164, align 8, !tbaa !25
  %166 = load i32, ptr %4, align 4, !tbaa !15
  %167 = zext i32 %166 to i64
  %168 = getelementptr inbounds i32, ptr %165, i64 %167
  %169 = load i32, ptr %168, align 4, !tbaa !15
  %170 = call i32 (i32, ptr, i32, ptr, ...) @liquid_error_fl(i32 noundef 3, ptr noundef @.str, i32 noundef 614, ptr noundef @.str.19, i32 noundef %169)
  store i32 %170, ptr %2, align 4
  store i32 1, ptr %12, align 4
  br label %202

171:                                              ; preds = %155, %145, %144
  %172 = load ptr, ptr %3, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct.firdespm_s, ptr %172, i32 0, i32 10
  %174 = load ptr, ptr %173, align 8, !tbaa !26
  %175 = load i32, ptr %4, align 4, !tbaa !15
  %176 = zext i32 %175 to i64
  %177 = getelementptr inbounds double, ptr %174, i64 %176
  %178 = load double, ptr %177, align 8, !tbaa !14
  %179 = load double, ptr %10, align 8, !tbaa !14
  %180 = fmul double %178, %179
  %181 = load ptr, ptr %3, align 8, !tbaa !5
  %182 = getelementptr inbounds %struct.firdespm_s, ptr %181, i32 0, i32 14
  %183 = load ptr, ptr %182, align 8, !tbaa !23
  %184 = load i32, ptr %7, align 4, !tbaa !15
  %185 = zext i32 %184 to i64
  %186 = getelementptr inbounds double, ptr %183, i64 %185
  store double %180, ptr %186, align 8, !tbaa !14
  br label %187

187:                                              ; preds = %171, %96
  %188 = load i32, ptr %7, align 4, !tbaa !15
  %189 = add i32 %188, 1
  store i32 %189, ptr %7, align 4, !tbaa !15
  br label %190

190:                                              ; preds = %187
  %191 = load i32, ptr %5, align 4, !tbaa !15
  %192 = add i32 %191, 1
  store i32 %192, ptr %5, align 4, !tbaa !15
  br label %76, !llvm.loop !27

193:                                              ; preds = %76
  %194 = load double, ptr %9, align 8, !tbaa !14
  %195 = load ptr, ptr %3, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.firdespm_s, ptr %195, i32 0, i32 12
  %197 = load ptr, ptr %196, align 8, !tbaa !19
  %198 = load i32, ptr %7, align 4, !tbaa !15
  %199 = sub i32 %198, 1
  %200 = zext i32 %199 to i64
  %201 = getelementptr inbounds double, ptr %197, i64 %200
  store double %194, ptr %201, align 8, !tbaa !14
  store i32 0, ptr %12, align 4
  br label %202

202:                                              ; preds = %193, %162
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  %203 = load i32, ptr %12, align 4
  switch i32 %203, label %367 [
    i32 0, label %204
  ]

204:                                              ; preds = %202
  br label %205

205:                                              ; preds = %204
  %206 = load i32, ptr %4, align 4, !tbaa !15
  %207 = add i32 %206, 1
  store i32 %207, ptr %4, align 4, !tbaa !15
  br label %22, !llvm.loop !29

208:                                              ; preds = %22
  %209 = load i32, ptr %7, align 4, !tbaa !15
  %210 = load ptr, ptr %3, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.firdespm_s, ptr %210, i32 0, i32 5
  store i32 %209, ptr %211, align 4, !tbaa !30
  %212 = load ptr, ptr %3, align 8, !tbaa !5
  %213 = getelementptr inbounds %struct.firdespm_s, ptr %212, i32 0, i32 7
  %214 = load i32, ptr %213, align 4, !tbaa !18
  %215 = icmp eq i32 %214, 0
  br i1 %215, label %216, label %268

216:                                              ; preds = %208
  %217 = load ptr, ptr %3, align 8, !tbaa !5
  %218 = getelementptr inbounds %struct.firdespm_s, ptr %217, i32 0, i32 1
  %219 = load i32, ptr %218, align 4, !tbaa !31
  %220 = icmp eq i32 %219, 0
  br i1 %220, label %221, label %267

221:                                              ; preds = %216
  store i32 0, ptr %4, align 4, !tbaa !15
  br label %222

222:                                              ; preds = %263, %221
  %223 = load i32, ptr %4, align 4, !tbaa !15
  %224 = load ptr, ptr %3, align 8, !tbaa !5
  %225 = getelementptr inbounds %struct.firdespm_s, ptr %224, i32 0, i32 5
  %226 = load i32, ptr %225, align 4, !tbaa !30
  %227 = icmp ult i32 %223, %226
  br i1 %227, label %228, label %266

228:                                              ; preds = %222
  %229 = load ptr, ptr %3, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.firdespm_s, ptr %229, i32 0, i32 12
  %231 = load ptr, ptr %230, align 8, !tbaa !19
  %232 = load i32, ptr %4, align 4, !tbaa !15
  %233 = zext i32 %232 to i64
  %234 = getelementptr inbounds double, ptr %231, i64 %233
  %235 = load double, ptr %234, align 8, !tbaa !14
  %236 = fmul double 0x400921FB54442D18, %235
  %237 = call double @cos(double noundef %236) #5
  %238 = load ptr, ptr %3, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.firdespm_s, ptr %238, i32 0, i32 13
  %240 = load ptr, ptr %239, align 8, !tbaa !22
  %241 = load i32, ptr %4, align 4, !tbaa !15
  %242 = zext i32 %241 to i64
  %243 = getelementptr inbounds double, ptr %240, i64 %242
  %244 = load double, ptr %243, align 8, !tbaa !14
  %245 = fdiv double %244, %237
  store double %245, ptr %243, align 8, !tbaa !14
  %246 = load ptr, ptr %3, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.firdespm_s, ptr %246, i32 0, i32 12
  %248 = load ptr, ptr %247, align 8, !tbaa !19
  %249 = load i32, ptr %4, align 4, !tbaa !15
  %250 = zext i32 %249 to i64
  %251 = getelementptr inbounds double, ptr %248, i64 %250
  %252 = load double, ptr %251, align 8, !tbaa !14
  %253 = fmul double 0x400921FB54442D18, %252
  %254 = call double @cos(double noundef %253) #5
  %255 = load ptr, ptr %3, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.firdespm_s, ptr %255, i32 0, i32 14
  %257 = load ptr, ptr %256, align 8, !tbaa !23
  %258 = load i32, ptr %4, align 4, !tbaa !15
  %259 = zext i32 %258 to i64
  %260 = getelementptr inbounds double, ptr %257, i64 %259
  %261 = load double, ptr %260, align 8, !tbaa !14
  %262 = fmul double %261, %254
  store double %262, ptr %260, align 8, !tbaa !14
  br label %263

263:                                              ; preds = %228
  %264 = load i32, ptr %4, align 4, !tbaa !15
  %265 = add i32 %264, 1
  store i32 %265, ptr %4, align 4, !tbaa !15
  br label %222, !llvm.loop !32

266:                                              ; preds = %222
  br label %267

267:                                              ; preds = %266, %216
  br label %366

268:                                              ; preds = %208
  %269 = load ptr, ptr %3, align 8, !tbaa !5
  %270 = getelementptr inbounds %struct.firdespm_s, ptr %269, i32 0, i32 1
  %271 = load i32, ptr %270, align 4, !tbaa !31
  %272 = icmp eq i32 %271, 0
  br i1 %272, label %273, label %319

273:                                              ; preds = %268
  store i32 0, ptr %4, align 4, !tbaa !15
  br label %274

274:                                              ; preds = %315, %273
  %275 = load i32, ptr %4, align 4, !tbaa !15
  %276 = load ptr, ptr %3, align 8, !tbaa !5
  %277 = getelementptr inbounds %struct.firdespm_s, ptr %276, i32 0, i32 5
  %278 = load i32, ptr %277, align 4, !tbaa !30
  %279 = icmp ult i32 %275, %278
  br i1 %279, label %280, label %318

280:                                              ; preds = %274
  %281 = load ptr, ptr %3, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.firdespm_s, ptr %281, i32 0, i32 12
  %283 = load ptr, ptr %282, align 8, !tbaa !19
  %284 = load i32, ptr %4, align 4, !tbaa !15
  %285 = zext i32 %284 to i64
  %286 = getelementptr inbounds double, ptr %283, i64 %285
  %287 = load double, ptr %286, align 8, !tbaa !14
  %288 = fmul double 0x400921FB54442D18, %287
  %289 = call double @sin(double noundef %288) #5
  %290 = load ptr, ptr %3, align 8, !tbaa !5
  %291 = getelementptr inbounds %struct.firdespm_s, ptr %290, i32 0, i32 13
  %292 = load ptr, ptr %291, align 8, !tbaa !22
  %293 = load i32, ptr %4, align 4, !tbaa !15
  %294 = zext i32 %293 to i64
  %295 = getelementptr inbounds double, ptr %292, i64 %294
  %296 = load double, ptr %295, align 8, !tbaa !14
  %297 = fdiv double %296, %289
  store double %297, ptr %295, align 8, !tbaa !14
  %298 = load ptr, ptr %3, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.firdespm_s, ptr %298, i32 0, i32 12
  %300 = load ptr, ptr %299, align 8, !tbaa !19
  %301 = load i32, ptr %4, align 4, !tbaa !15
  %302 = zext i32 %301 to i64
  %303 = getelementptr inbounds double, ptr %300, i64 %302
  %304 = load double, ptr %303, align 8, !tbaa !14
  %305 = fmul double 0x400921FB54442D18, %304
  %306 = call double @sin(double noundef %305) #5
  %307 = load ptr, ptr %3, align 8, !tbaa !5
  %308 = getelementptr inbounds %struct.firdespm_s, ptr %307, i32 0, i32 14
  %309 = load ptr, ptr %308, align 8, !tbaa !23
  %310 = load i32, ptr %4, align 4, !tbaa !15
  %311 = zext i32 %310 to i64
  %312 = getelementptr inbounds double, ptr %309, i64 %311
  %313 = load double, ptr %312, align 8, !tbaa !14
  %314 = fmul double %313, %306
  store double %314, ptr %312, align 8, !tbaa !14
  br label %315

315:                                              ; preds = %280
  %316 = load i32, ptr %4, align 4, !tbaa !15
  %317 = add i32 %316, 1
  store i32 %317, ptr %4, align 4, !tbaa !15
  br label %274, !llvm.loop !33

318:                                              ; preds = %274
  br label %365

319:                                              ; preds = %268
  store i32 0, ptr %4, align 4, !tbaa !15
  br label %320

320:                                              ; preds = %361, %319
  %321 = load i32, ptr %4, align 4, !tbaa !15
  %322 = load ptr, ptr %3, align 8, !tbaa !5
  %323 = getelementptr inbounds %struct.firdespm_s, ptr %322, i32 0, i32 5
  %324 = load i32, ptr %323, align 4, !tbaa !30
  %325 = icmp ult i32 %321, %324
  br i1 %325, label %326, label %364

326:                                              ; preds = %320
  %327 = load ptr, ptr %3, align 8, !tbaa !5
  %328 = getelementptr inbounds %struct.firdespm_s, ptr %327, i32 0, i32 12
  %329 = load ptr, ptr %328, align 8, !tbaa !19
  %330 = load i32, ptr %4, align 4, !tbaa !15
  %331 = zext i32 %330 to i64
  %332 = getelementptr inbounds double, ptr %329, i64 %331
  %333 = load double, ptr %332, align 8, !tbaa !14
  %334 = fmul double 0x401921FB54442D18, %333
  %335 = call double @sin(double noundef %334) #5
  %336 = load ptr, ptr %3, align 8, !tbaa !5
  %337 = getelementptr inbounds %struct.firdespm_s, ptr %336, i32 0, i32 13
  %338 = load ptr, ptr %337, align 8, !tbaa !22
  %339 = load i32, ptr %4, align 4, !tbaa !15
  %340 = zext i32 %339 to i64
  %341 = getelementptr inbounds double, ptr %338, i64 %340
  %342 = load double, ptr %341, align 8, !tbaa !14
  %343 = fdiv double %342, %335
  store double %343, ptr %341, align 8, !tbaa !14
  %344 = load ptr, ptr %3, align 8, !tbaa !5
  %345 = getelementptr inbounds %struct.firdespm_s, ptr %344, i32 0, i32 12
  %346 = load ptr, ptr %345, align 8, !tbaa !19
  %347 = load i32, ptr %4, align 4, !tbaa !15
  %348 = zext i32 %347 to i64
  %349 = getelementptr inbounds double, ptr %346, i64 %348
  %350 = load double, ptr %349, align 8, !tbaa !14
  %351 = fmul double 0x401921FB54442D18, %350
  %352 = call double @sin(double noundef %351) #5
  %353 = load ptr, ptr %3, align 8, !tbaa !5
  %354 = getelementptr inbounds %struct.firdespm_s, ptr %353, i32 0, i32 14
  %355 = load ptr, ptr %354, align 8, !tbaa !23
  %356 = load i32, ptr %4, align 4, !tbaa !15
  %357 = zext i32 %356 to i64
  %358 = getelementptr inbounds double, ptr %355, i64 %357
  %359 = load double, ptr %358, align 8, !tbaa !14
  %360 = fmul double %359, %352
  store double %360, ptr %358, align 8, !tbaa !14
  br label %361

361:                                              ; preds = %326
  %362 = load i32, ptr %4, align 4, !tbaa !15
  %363 = add i32 %362, 1
  store i32 %363, ptr %4, align 4, !tbaa !15
  br label %320, !llvm.loop !34

364:                                              ; preds = %320
  br label %365

365:                                              ; preds = %364, %318
  br label %366

366:                                              ; preds = %365, %267
  store i32 0, ptr %2, align 4
  store i32 1, ptr %12, align 4
  br label %367

367:                                              ; preds = %366, %202
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %5) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #5
  %368 = load i32, ptr %2, align 4
  ret i32 %368
}

; Function Attrs: nounwind
declare float @expf(float noundef) #4

; Function Attrs: nounwind
declare double @cos(double noundef) #4

; Function Attrs: nounwind
declare double @sin(double noundef) #4

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !11, i64 24}
!10 = !{!"firdespm_s", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !12, i64 120, !6, i64 128, !11, i64 136, !6, i64 144, !6, i64 152}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!10, !11, i64 12}
!14 = !{!12, !12, i64 0}
!15 = !{!11, !11, i64 0}
!16 = !{!10, !11, i64 16}
!17 = !{!10, !6, i64 32}
!18 = !{!10, !11, i64 28}
!19 = !{!10, !6, i64 64}
!20 = !{!10, !6, i64 144}
!21 = !{!10, !6, i64 152}
!22 = !{!10, !6, i64 72}
!23 = !{!10, !6, i64 80}
!24 = !{!10, !6, i64 40}
!25 = !{!10, !6, i64 56}
!26 = !{!10, !6, i64 48}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = distinct !{!29, !28}
!30 = !{!10, !11, i64 20}
!31 = !{!10, !11, i64 4}
!32 = distinct !{!32, !28}
!33 = distinct !{!33, !28}
!34 = distinct !{!34, !28}


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

@.str = external hidden unnamed_addr constant [80 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [54 x i8], align 1

declare i32 @liquid_error_fl(i32 noundef, ptr noundef, i32 noundef, ptr noundef, ...) local_unnamed_addr #0

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

; Function Attrs: nounwind uwtable
define dso_local i32 @firdespm_init_grid(ptr nocapture noundef %0) local_unnamed_addr #2 {
  %2 = getelementptr inbounds i8, ptr %0, i64 24
  %3 = load i32, ptr %2, align 8, !tbaa !5
  %4 = getelementptr inbounds i8, ptr %0, i64 12
  %5 = load i32, ptr %4, align 4, !tbaa !12
  %6 = mul i32 %5, %3
  %7 = uitofp i32 %6 to double
  %8 = fdiv double 5.000000e-01, %7
  %9 = getelementptr inbounds i8, ptr %0, i64 16
  %10 = load i32, ptr %9, align 8, !tbaa !13
  %.not128 = icmp eq i32 %10, 0
  br i1 %.not128, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %1
  %11 = getelementptr inbounds i8, ptr %0, i64 32
  %12 = getelementptr inbounds i8, ptr %0, i64 28
  %13 = getelementptr inbounds i8, ptr %0, i64 64
  %14 = getelementptr inbounds i8, ptr %0, i64 144
  %15 = getelementptr inbounds i8, ptr %0, i64 152
  %16 = getelementptr inbounds i8, ptr %0, i64 72
  %17 = getelementptr inbounds i8, ptr %0, i64 80
  %18 = getelementptr inbounds i8, ptr %0, i64 40
  %19 = getelementptr inbounds i8, ptr %0, i64 56
  %20 = getelementptr inbounds i8, ptr %0, i64 48
  br label %21

21:                                               ; preds = %.lr.ph, %.split118.us
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %.split118.us ]
  %.099121 = phi i32 [ 0, %.lr.ph ], [ %.us-phi119, %.split118.us ]
  %22 = load ptr, ptr %11, align 8, !tbaa !14
  %23 = trunc nuw i64 %indvars.iv to i32
  %24 = shl i32 %23, 1
  %25 = zext i32 %24 to i64
  %26 = getelementptr inbounds double, ptr %22, i64 %25
  %27 = load double, ptr %26, align 8, !tbaa !15
  %28 = or disjoint i32 %24, 1
  %29 = zext i32 %28 to i64
  %30 = getelementptr inbounds double, ptr %22, i64 %29
  %31 = load double, ptr %30, align 8, !tbaa !15
  %32 = icmp eq i64 %indvars.iv, 0
  br i1 %32, label %33, label %38

33:                                               ; preds = %21
  %34 = load i32, ptr %12, align 4, !tbaa !16
  %.not = icmp eq i32 %34, 0
  br i1 %.not, label %38, label %35

35:                                               ; preds = %33
  %36 = fcmp olt double %27, %8
  %37 = select i1 %36, double %8, double %27
  br label %38

38:                                               ; preds = %35, %33, %21
  %.098 = phi double [ %37, %35 ], [ %27, %33 ], [ %27, %21 ]
  %39 = fsub double %31, %.098
  %40 = fdiv double %39, %8
  %41 = fadd double %40, 5.000000e-01
  %42 = fptoui double %41 to i32
  %43 = load ptr, ptr %14, align 8, !tbaa !17
  %44 = icmp eq ptr %43, null
  br i1 %44, label %.split.us, label %.split.preheader

.split.preheader:                                 ; preds = %38
  %umax = tail call i32 @llvm.umax.i32(i32 %42, i32 1)
  br label %.split

.split.us:                                        ; preds = %38
  %45 = load ptr, ptr %13, align 8, !tbaa !18
  %46 = load ptr, ptr %18, align 8, !tbaa !19
  %47 = getelementptr inbounds double, ptr %46, i64 %indvars.iv
  %48 = load ptr, ptr %16, align 8, !tbaa !20
  %49 = load ptr, ptr %19, align 8, !tbaa !21
  %50 = getelementptr inbounds i32, ptr %49, i64 %indvars.iv
  %umax140 = tail call i32 @llvm.umax.i32(i32 %42, i32 1)
  br label %51

51:                                               ; preds = %72, %.split.us
  %.1100116.us = phi i32 [ %.099121, %.split.us ], [ %79, %72 ]
  %.0104115.us = phi i32 [ 0, %.split.us ], [ %80, %72 ]
  %52 = uitofp i32 %.0104115.us to double
  %53 = tail call double @llvm.fmuladd.f64(double %52, double %8, double %.098)
  %54 = zext i32 %.1100116.us to i64
  %55 = getelementptr inbounds double, ptr %45, i64 %54
  store double %53, ptr %55, align 8, !tbaa !15
  %56 = load double, ptr %47, align 8, !tbaa !15
  %57 = getelementptr inbounds double, ptr %48, i64 %54
  store double %56, ptr %57, align 8, !tbaa !15
  %58 = load i32, ptr %50, align 4, !tbaa !22
  switch i32 %58, label %.thread [
    i32 0, label %72
    i32 1, label %64
    i32 2, label %59
  ]

59:                                               ; preds = %51
  %60 = uitofp i32 %.0104115.us to float
  %61 = fmul float %60, 0x40059999A0000000
  %62 = fpext float %61 to double
  %63 = tail call double @llvm.fmuladd.f64(double %62, double %8, double 1.000000e+00)
  br label %72

64:                                               ; preds = %51
  %65 = uitofp i32 %.0104115.us to float
  %66 = fmul float %65, 2.000000e+00
  %67 = fpext float %66 to double
  %68 = fmul double %8, %67
  %69 = fptrunc double %68 to float
  %70 = tail call float @expf(float noundef %69) #5, !tbaa !22
  %71 = fpext float %70 to double
  br label %72

72:                                               ; preds = %64, %59, %51
  %.096.us = phi double [ %63, %59 ], [ %71, %64 ], [ 1.000000e+00, %51 ]
  %73 = load ptr, ptr %20, align 8, !tbaa !23
  %74 = getelementptr inbounds double, ptr %73, i64 %indvars.iv
  %75 = load double, ptr %74, align 8, !tbaa !15
  %76 = fmul double %.096.us, %75
  %77 = load ptr, ptr %17, align 8, !tbaa !24
  %78 = getelementptr inbounds double, ptr %77, i64 %54
  store double %76, ptr %78, align 8, !tbaa !15
  %79 = add i32 %.1100116.us, 1
  %80 = add nuw i32 %.0104115.us, 1
  %exitcond141.not = icmp eq i32 %80, %umax140
  br i1 %exitcond141.not, label %.split118.us, label %51, !llvm.loop !25

.split:                                           ; preds = %.split.preheader, %124
  %.1100116 = phi i32 [ %125, %124 ], [ %.099121, %.split.preheader ]
  %.0104115 = phi i32 [ %126, %124 ], [ 0, %.split.preheader ]
  %81 = uitofp i32 %.0104115 to double
  %82 = tail call double @llvm.fmuladd.f64(double %81, double %8, double %.098)
  %83 = load ptr, ptr %13, align 8, !tbaa !18
  %84 = zext i32 %.1100116 to i64
  %85 = getelementptr inbounds double, ptr %83, i64 %84
  store double %82, ptr %85, align 8, !tbaa !15
  %86 = load ptr, ptr %14, align 8, !tbaa !17
  %.not106 = icmp eq ptr %86, null
  br i1 %.not106, label %94, label %87

87:                                               ; preds = %.split
  %88 = load ptr, ptr %15, align 8, !tbaa !27
  %89 = load ptr, ptr %16, align 8, !tbaa !20
  %90 = getelementptr inbounds double, ptr %89, i64 %84
  %91 = load ptr, ptr %17, align 8, !tbaa !24
  %92 = getelementptr inbounds double, ptr %91, i64 %84
  %93 = tail call i32 %86(double noundef %82, ptr noundef %88, ptr noundef %90, ptr noundef %92) #5
  br label %124

94:                                               ; preds = %.split
  %95 = load ptr, ptr %18, align 8, !tbaa !19
  %96 = getelementptr inbounds double, ptr %95, i64 %indvars.iv
  %97 = load double, ptr %96, align 8, !tbaa !15
  %98 = load ptr, ptr %16, align 8, !tbaa !20
  %99 = getelementptr inbounds double, ptr %98, i64 %84
  store double %97, ptr %99, align 8, !tbaa !15
  %100 = load ptr, ptr %19, align 8, !tbaa !21
  %101 = getelementptr inbounds i32, ptr %100, i64 %indvars.iv
  %102 = load i32, ptr %101, align 4, !tbaa !22
  switch i32 %102, label %.thread [
    i32 0, label %117
    i32 1, label %103
    i32 2, label %111
  ]

103:                                              ; preds = %94
  %104 = uitofp i32 %.0104115 to float
  %105 = fmul float %104, 2.000000e+00
  %106 = fpext float %105 to double
  %107 = fmul double %8, %106
  %108 = fptrunc double %107 to float
  %109 = tail call float @expf(float noundef %108) #5, !tbaa !22
  %110 = fpext float %109 to double
  br label %117

111:                                              ; preds = %94
  %112 = uitofp i32 %.0104115 to float
  %113 = fmul float %112, 0x40059999A0000000
  %114 = fpext float %113 to double
  %115 = tail call double @llvm.fmuladd.f64(double %114, double %8, double 1.000000e+00)
  br label %117

.thread:                                          ; preds = %94, %51
  %.us-phi = phi i32 [ %58, %51 ], [ %102, %94 ]
  %116 = tail call i32 (i32, ptr, i32, ptr, ...) @liquid_error_fl(i32 noundef 3, ptr noundef nonnull @.str, i32 noundef 614, ptr noundef nonnull @.str.19, i32 noundef %.us-phi) #5
  br label %.loopexit

117:                                              ; preds = %94, %111, %103
  %.096 = phi double [ %115, %111 ], [ %110, %103 ], [ 1.000000e+00, %94 ]
  %118 = load ptr, ptr %20, align 8, !tbaa !23
  %119 = getelementptr inbounds double, ptr %118, i64 %indvars.iv
  %120 = load double, ptr %119, align 8, !tbaa !15
  %121 = fmul double %.096, %120
  %122 = load ptr, ptr %17, align 8, !tbaa !24
  %123 = getelementptr inbounds double, ptr %122, i64 %84
  store double %121, ptr %123, align 8, !tbaa !15
  br label %124

124:                                              ; preds = %117, %87
  %125 = add i32 %.1100116, 1
  %126 = add nuw i32 %.0104115, 1
  %exitcond.not = icmp eq i32 %126, %umax
  br i1 %exitcond.not, label %.split118.us.loopexit135, label %.split, !llvm.loop !28

.split118.us.loopexit135:                         ; preds = %124
  %.pre = load ptr, ptr %13, align 8, !tbaa !18
  br label %.split118.us

.split118.us:                                     ; preds = %72, %.split118.us.loopexit135
  %127 = phi ptr [ %.pre, %.split118.us.loopexit135 ], [ %45, %72 ]
  %.us-phi119 = phi i32 [ %125, %.split118.us.loopexit135 ], [ %79, %72 ]
  %128 = add i32 %.us-phi119, -1
  %129 = zext i32 %128 to i64
  %130 = getelementptr inbounds double, ptr %127, i64 %129
  store double %31, ptr %130, align 8, !tbaa !15
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %131 = load i32, ptr %9, align 8, !tbaa !13
  %132 = zext i32 %131 to i64
  %133 = icmp ult i64 %indvars.iv.next, %132
  br i1 %133, label %21, label %._crit_edge, !llvm.loop !30

._crit_edge:                                      ; preds = %.split118.us, %1
  %134 = phi i32 [ 0, %1 ], [ %.us-phi119, %.split118.us ]
  %135 = getelementptr inbounds i8, ptr %0, i64 20
  store i32 %134, ptr %135, align 4, !tbaa !31
  %136 = getelementptr inbounds i8, ptr %0, i64 28
  %137 = load i32, ptr %136, align 4, !tbaa !16
  %138 = icmp eq i32 %137, 0
  %139 = getelementptr inbounds i8, ptr %0, i64 4
  %140 = load i32, ptr %139, align 4, !tbaa !32
  %141 = icmp ne i32 %140, 0
  %.not131 = icmp eq i32 %134, 0
  br i1 %138, label %142, label %168

142:                                              ; preds = %._crit_edge
  %or.cond = or i1 %141, %.not131
  br i1 %or.cond, label %.loopexit, label %.lr.ph127

.lr.ph127:                                        ; preds = %142
  %143 = getelementptr inbounds i8, ptr %0, i64 64
  %144 = getelementptr inbounds i8, ptr %0, i64 72
  %145 = getelementptr inbounds i8, ptr %0, i64 80
  br label %146

146:                                              ; preds = %.lr.ph127, %146
  %indvars.iv149 = phi i64 [ 0, %.lr.ph127 ], [ %indvars.iv.next150, %146 ]
  %147 = load ptr, ptr %143, align 8, !tbaa !18
  %148 = getelementptr inbounds double, ptr %147, i64 %indvars.iv149
  %149 = load double, ptr %148, align 8, !tbaa !15
  %150 = fmul double %149, 0x400921FB54442D18
  %151 = tail call double @cos(double noundef %150) #5
  %152 = load ptr, ptr %144, align 8, !tbaa !20
  %153 = getelementptr inbounds double, ptr %152, i64 %indvars.iv149
  %154 = load double, ptr %153, align 8, !tbaa !15
  %155 = fdiv double %154, %151
  store double %155, ptr %153, align 8, !tbaa !15
  %156 = load ptr, ptr %143, align 8, !tbaa !18
  %157 = getelementptr inbounds double, ptr %156, i64 %indvars.iv149
  %158 = load double, ptr %157, align 8, !tbaa !15
  %159 = fmul double %158, 0x400921FB54442D18
  %160 = tail call double @cos(double noundef %159) #5
  %161 = load ptr, ptr %145, align 8, !tbaa !24
  %162 = getelementptr inbounds double, ptr %161, i64 %indvars.iv149
  %163 = load double, ptr %162, align 8, !tbaa !15
  %164 = fmul double %160, %163
  store double %164, ptr %162, align 8, !tbaa !15
  %indvars.iv.next150 = add nuw nsw i64 %indvars.iv149, 1
  %165 = load i32, ptr %135, align 4, !tbaa !31
  %166 = zext i32 %165 to i64
  %167 = icmp ult i64 %indvars.iv.next150, %166
  br i1 %167, label %146, label %.loopexit, !llvm.loop !33

168:                                              ; preds = %._crit_edge
  br i1 %141, label %.preheader111, label %.preheader109

.preheader111:                                    ; preds = %168
  br i1 %.not131, label %.loopexit, label %.lr.ph123

.lr.ph123:                                        ; preds = %.preheader111
  %169 = getelementptr inbounds i8, ptr %0, i64 64
  %170 = getelementptr inbounds i8, ptr %0, i64 72
  %171 = getelementptr inbounds i8, ptr %0, i64 80
  br label %197

.preheader109:                                    ; preds = %168
  br i1 %.not131, label %.loopexit, label %.lr.ph125

.lr.ph125:                                        ; preds = %.preheader109
  %172 = getelementptr inbounds i8, ptr %0, i64 64
  %173 = getelementptr inbounds i8, ptr %0, i64 72
  %174 = getelementptr inbounds i8, ptr %0, i64 80
  br label %175

175:                                              ; preds = %.lr.ph125, %175
  %indvars.iv146 = phi i64 [ 0, %.lr.ph125 ], [ %indvars.iv.next147, %175 ]
  %176 = load ptr, ptr %172, align 8, !tbaa !18
  %177 = getelementptr inbounds double, ptr %176, i64 %indvars.iv146
  %178 = load double, ptr %177, align 8, !tbaa !15
  %179 = fmul double %178, 0x400921FB54442D18
  %180 = tail call double @sin(double noundef %179) #5
  %181 = load ptr, ptr %173, align 8, !tbaa !20
  %182 = getelementptr inbounds double, ptr %181, i64 %indvars.iv146
  %183 = load double, ptr %182, align 8, !tbaa !15
  %184 = fdiv double %183, %180
  store double %184, ptr %182, align 8, !tbaa !15
  %185 = load ptr, ptr %172, align 8, !tbaa !18
  %186 = getelementptr inbounds double, ptr %185, i64 %indvars.iv146
  %187 = load double, ptr %186, align 8, !tbaa !15
  %188 = fmul double %187, 0x400921FB54442D18
  %189 = tail call double @sin(double noundef %188) #5
  %190 = load ptr, ptr %174, align 8, !tbaa !24
  %191 = getelementptr inbounds double, ptr %190, i64 %indvars.iv146
  %192 = load double, ptr %191, align 8, !tbaa !15
  %193 = fmul double %189, %192
  store double %193, ptr %191, align 8, !tbaa !15
  %indvars.iv.next147 = add nuw nsw i64 %indvars.iv146, 1
  %194 = load i32, ptr %135, align 4, !tbaa !31
  %195 = zext i32 %194 to i64
  %196 = icmp ult i64 %indvars.iv.next147, %195
  br i1 %196, label %175, label %.loopexit, !llvm.loop !34

197:                                              ; preds = %.lr.ph123, %197
  %indvars.iv143 = phi i64 [ 0, %.lr.ph123 ], [ %indvars.iv.next144, %197 ]
  %198 = load ptr, ptr %169, align 8, !tbaa !18
  %199 = getelementptr inbounds double, ptr %198, i64 %indvars.iv143
  %200 = load double, ptr %199, align 8, !tbaa !15
  %201 = fmul double %200, 0x401921FB54442D18
  %202 = tail call double @sin(double noundef %201) #5
  %203 = load ptr, ptr %170, align 8, !tbaa !20
  %204 = getelementptr inbounds double, ptr %203, i64 %indvars.iv143
  %205 = load double, ptr %204, align 8, !tbaa !15
  %206 = fdiv double %205, %202
  store double %206, ptr %204, align 8, !tbaa !15
  %207 = load ptr, ptr %169, align 8, !tbaa !18
  %208 = getelementptr inbounds double, ptr %207, i64 %indvars.iv143
  %209 = load double, ptr %208, align 8, !tbaa !15
  %210 = fmul double %209, 0x401921FB54442D18
  %211 = tail call double @sin(double noundef %210) #5
  %212 = load ptr, ptr %171, align 8, !tbaa !24
  %213 = getelementptr inbounds double, ptr %212, i64 %indvars.iv143
  %214 = load double, ptr %213, align 8, !tbaa !15
  %215 = fmul double %211, %214
  store double %215, ptr %213, align 8, !tbaa !15
  %indvars.iv.next144 = add nuw nsw i64 %indvars.iv143, 1
  %216 = load i32, ptr %135, align 4, !tbaa !31
  %217 = zext i32 %216 to i64
  %218 = icmp ult i64 %indvars.iv.next144, %217
  br i1 %218, label %197, label %.loopexit, !llvm.loop !35

.loopexit:                                        ; preds = %175, %197, %146, %.preheader111, %.preheader109, %.thread, %142
  %.2 = phi i32 [ 0, %142 ], [ %116, %.thread ], [ 0, %.preheader109 ], [ 0, %.preheader111 ], [ 0, %146 ], [ 0, %197 ], [ 0, %175 ]
  ret i32 %.2
}

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

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @sin(double 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 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { 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 nofree nounwind willreturn memory(write) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #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, !7, i64 24}
!6 = !{!"firdespm_s", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !10, i64 32, !10, i64 40, !10, i64 48, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !11, i64 120, !10, i64 128, !7, i64 136, !10, i64 144, !10, i64 152}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"double", !8, i64 0}
!12 = !{!6, !7, i64 12}
!13 = !{!6, !7, i64 16}
!14 = !{!6, !10, i64 32}
!15 = !{!11, !11, i64 0}
!16 = !{!6, !7, i64 28}
!17 = !{!6, !10, i64 144}
!18 = !{!6, !10, i64 64}
!19 = !{!6, !10, i64 40}
!20 = !{!6, !10, i64 72}
!21 = !{!6, !10, i64 56}
!22 = !{!7, !7, i64 0}
!23 = !{!6, !10, i64 48}
!24 = !{!6, !10, i64 80}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = !{!6, !10, i64 152}
!28 = distinct !{!28, !26, !29}
!29 = !{!"llvm.loop.unswitch.partial.disable"}
!30 = distinct !{!30, !26}
!31 = !{!6, !7, i64 20}
!32 = !{!6, !7, i64 4}
!33 = distinct !{!33, !26}
!34 = distinct !{!34, !26}
!35 = distinct !{!35, !26}


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