#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ blackman(float *, int);
int ceil(int);
int sin(double);
float setPFIR(short *pfircoeffs, float freq_in, float BW, int matched) {
  int pi = 3.14159265359;
  int length = 63;
  float window[63];
  float PFIRgain, gaintemp;
  double wp, ws, wc;
  int n;
  blackman(window, length);
  PFIRgain = 0;
  if (matched) {
    wc = freq_in / BW / 2;
    for (n = 0; n < 31; n++) {
      if (n > ceil(31 - wc)) {
        pfircoeffs[n] = 32767;
      } else {
        pfircoeffs[n] = 0;
      }
      PFIRgain = PFIRgain + pfircoeffs[n];
    }
    pfircoeffs[31] = 32767;
    PFIRgain = 2 * PFIRgain + pfircoeffs[31];
    PFIRgain = PFIRgain / 65536;
  } else {
    wc = pi * (float)BW / (float)freq_in;
    for (n = 0; n < 31; n++) {
      pfircoeffs[n] =
          (short)(32767 * window[n] * (pi / wc) * sin(wc * ((float)n - 31)) /
                      (pi * ((float)n - 31)) +
                  .49999);
      PFIRgain = PFIRgain + pfircoeffs[n];
    }
    pfircoeffs[31] = 32767;
    PFIRgain = 2 * PFIRgain + pfircoeffs[31];
    PFIRgain = PFIRgain / 65536;
  }
  if (PFIRgain > 1) {
    gaintemp = PFIRgain;
    PFIRgain = 0;
    for (n = 0; n < 31; n++) {
      pfircoeffs[n] = (short)((1 / gaintemp) * (float)pfircoeffs[n] + 0.499999);
      PFIRgain = PFIRgain + pfircoeffs[n];
    }
    pfircoeffs[31] = (short)((1 / gaintemp) * (float)pfircoeffs[31] + 0.49999);
    PFIRgain = 2 * PFIRgain + pfircoeffs[31];
    PFIRgain = PFIRgain / 65536;
  }
  return PFIRgain;
}


x86 assembly (clang, -O0):
<setPFIR>:
push   %rbp
mov    %rsp,%rbp
sub    $0x160,%rsp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movss  %xmm1,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movl   $0x3,-0x18(%rbp)
movl   $0x3f,-0x1c(%rbp)
lea    -0x120(%rbp),%rdi
mov    -0x1c(%rbp),%esi
call   1040 <blackman@plt>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
cmpl   $0x0,-0x14(%rbp)
je     129d <setPFIR+0x16d>
movss  -0xc(%rbp),%xmm0
divss  -0x10(%rbp),%xmm0
movss  0xe7c(%rip),%xmm1
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x140(%rbp)
ff
movl   $0x0,-0x144(%rbp)
cmpl   $0x1f,-0x144(%rbp)
jge    124e <setPFIR+0x11e>
mov    -0x144(%rbp),%eax
mov    %eax,-0x148(%rbp)
movsd  0xe5d(%rip),%xmm0
subsd  -0x140(%rbp),%xmm0
ff
cvttsd2si %xmm0,%edi
call   1030 <ceil@plt>
mov    %eax,%ecx
mov    -0x148(%rbp),%eax
cmp    %ecx,%eax
jle    1202 <setPFIR+0xd2>
mov    -0x8(%rbp),%rax
movslq -0x144(%rbp),%rcx
movw   $0x7fff,(%rax,%rcx,2)
jmp    1213 <setPFIR+0xe3>
mov    -0x8(%rbp),%rax
movslq -0x144(%rbp),%rcx
movw   $0x0,(%rax,%rcx,2)
movss  -0x124(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
movslq -0x144(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2ss %eax,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
mov    -0x144(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x144(%rbp)
jmp    11aa <setPFIR+0x7a>
mov    -0x8(%rbp),%rax
movw   $0x7fff,0x3e(%rax)
movss  -0x124(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
movswl 0x3e(%rax),%eax
cvtsi2ss %eax,%xmm1
addss  %xmm0,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
movss  -0x124(%rbp),%xmm0
ff
movss  0xd74(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
jmp    140f <setPFIR+0x2df>
cvtsi2ssl -0x18(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x140(%rbp)
ff
movl   $0x0,-0x144(%rbp)
cmpl   $0x1f,-0x144(%rbp)
jge    13c5 <setPFIR+0x295>
movslq -0x144(%rbp),%rcx
mov    %ecx,%eax
movss  -0x120(%rbp,%rcx,4),%xmm0
ff ff
movss  0xd1b(%rip),%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm1
cvtsi2sdl -0x18(%rbp),%xmm2
movsd  -0x140(%rbp),%xmm0
ff
divsd  %xmm0,%xmm2
mulsd  %xmm2,%xmm1
movsd  %xmm1,-0x158(%rbp)
ff
cvtsi2ss %eax,%xmm1
movss  0xcee(%rip),%xmm2
movss  %xmm2,-0x14c(%rbp)
ff
subss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
call   1050 <sin@plt>
movsd  -0x158(%rbp),%xmm0
ff
movss  -0x14c(%rbp),%xmm3
ff
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
cvtsi2ssl -0x18(%rbp),%xmm1
cvtsi2ssl -0x144(%rbp),%xmm2
ff
subss  %xmm3,%xmm2
mulss  %xmm2,%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
movsd  0xca8(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
movslq -0x144(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
movss  -0x124(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
movslq -0x144(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2ss %eax,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
mov    -0x144(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x144(%rbp)
jmp    12c2 <setPFIR+0x192>
mov    -0x8(%rbp),%rax
movw   $0x7fff,0x3e(%rax)
movss  -0x124(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
movswl 0x3e(%rax),%eax
cvtsi2ss %eax,%xmm1
addss  %xmm0,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
movss  -0x124(%rbp),%xmm0
ff
movss  0xbfd(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
movss  -0x124(%rbp),%xmm0
ff
movss  0xbf1(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    1569 <setPFIR+0x439>
movss  -0x124(%rbp),%xmm0
ff
movss  %xmm0,-0x128(%rbp)
ff
xorps  %xmm0,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
movl   $0x0,-0x144(%rbp)
cmpl   $0x1f,-0x144(%rbp)
jge    14e6 <setPFIR+0x3b6>
movss  -0x128(%rbp),%xmm1
ff
movss  0xba6(%rip),%xmm0
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x144(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xb8f(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
movslq -0x144(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
movss  -0x124(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
movslq -0x144(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2ss %eax,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
mov    -0x144(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x144(%rbp)
jmp    144d <setPFIR+0x31d>
movss  -0x128(%rbp),%xmm1
ff
movss  0xb1a(%rip),%xmm0
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movswl 0x3e(%rax),%eax
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xb02(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %cx,0x3e(%rax)
movss  -0x124(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
movswl 0x3e(%rax),%eax
cvtsi2ss %eax,%xmm1
addss  %xmm0,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
movss  -0x124(%rbp),%xmm0
ff
movss  0xaa3(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x124(%rbp)
ff
movss  -0x124(%rbp),%xmm0
ff
add    $0x160,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<setPFIR>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x138,%rsp
mov    %esi,%ebp
movss  %xmm1,0x10(%rsp)
movss  %xmm0,0xc(%rsp)
mov    %rdi,%r15
lea    0x30(%rsp),%rdi
mov    $0x3f,%esi
call   1040 <blackman@plt>
test   %ebp,%ebp
je     1225 <setPFIR+0xf5>
movss  0xc(%rsp),%xmm0
divss  0x10(%rsp),%xmm0
mulss  0xe87(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xe93(%rip),%xmm0
cvttsd2si %xmm0,%r14d
xorpd  %xmm0,%xmm0
movss  %xmm0,0xc(%rsp)
xor    %ebx,%ebx
jmp    11c4 <setPFIR+0x94>
nopl   0x0(%rax,%rax,1)
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
mov    %ax,0x2(%r15,%rbx,2)
movss  0xc(%rsp),%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,0xc(%rsp)
add    $0x1,%rbp
mov    %rbp,%rbx
mov    %r14d,%edi
call   1030 <ceil@plt>
movslq %eax,%rcx
mov    $0x7fff,%eax
cmp    %rcx,%rbx
jg     11db <setPFIR+0xab>
xor    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
mov    %ax,(%r15,%rbx,2)
movss  0xc(%rsp),%xmm0
addss  %xmm1,%xmm0
lea    0x1(%rbx),%rbp
cmp    $0x1f,%rbp
je     1301 <setPFIR+0x1d1>
movss  %xmm0,0xc(%rsp)
mov    %r14d,%edi
call   1030 <ceil@plt>
movslq %eax,%rcx
lea    -0x1(%rbp),%rdx
xor    %eax,%eax
cmp    %rcx,%rdx
jl     11a0 <setPFIR+0x70>
mov    $0x7fff,%eax
jmp    11a0 <setPFIR+0x70>
movss  0x10(%rsp),%xmm0
mulss  0xdd1(%rip),%xmm0
divss  0xc(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xddb(%rip),%xmm1
movsd  %xmm0,0x28(%rsp)
divsd  %xmm0,%xmm1
movsd  %xmm1,0x20(%rsp)
xorps  %xmm0,%xmm0
xor    %ebp,%ebp
nopw   0x0(%rax,%rax,1)
movss  %xmm0,0xc(%rsp)
movss  0x30(%rsp,%rbp,4),%xmm0
mulss  0xd94(%rip),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
cvtsi2ss %ebp,%xmm1
mulsd  0x20(%rsp),%xmm0
movsd  %xmm0,0x10(%rsp)
addss  0xd79(%rip),%xmm1
movss  %xmm1,0x1c(%rsp)
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
mulsd  0x28(%rsp),%xmm0
call   1050 <sin@plt>
movss  0xc(%rsp),%xmm0
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
mulsd  0x10(%rsp),%xmm2
movss  0x1c(%rsp),%xmm1
mulss  0xd38(%rip),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm2
addsd  0xd4c(%rip),%xmm2
cvttsd2si %xmm2,%eax
movswl %ax,%ecx
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
mov    %ax,(%r15,%rbp,2)
addss  %xmm1,%xmm0
add    $0x1,%rbp
cmp    $0x1f,%rbp
jne    1260 <setPFIR+0x130>
addss  %xmm0,%xmm0
addss  0xcfb(%rip),%xmm0
mulss  0xcfb(%rip),%xmm0
movw   $0x7fff,0x3e(%r15)
ucomiss 0xcf1(%rip),%xmm0
jbe    13ff <setPFIR+0x2cf>
movss  0xce3(%rip),%xmm4
divss  %xmm0,%xmm4
xorpd  %xmm2,%xmm2
mov    $0x1,%eax
movsd  0xcea(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
movswl -0x2(%r15,%rax,2),%ecx
xorps  %xmm3,%xmm3
cvtsi2ss %ecx,%xmm3
mulss  %xmm4,%xmm3
cvtss2sd %xmm3,%xmm3
addsd  %xmm1,%xmm3
cvttsd2si %xmm3,%ecx
movswl %cx,%edx
xorps  %xmm0,%xmm0
cvtsi2ss %edx,%xmm0
mov    %cx,-0x2(%r15,%rax,2)
addss  %xmm2,%xmm0
cmp    $0x1f,%rax
je     13bf <setPFIR+0x28f>
movswl (%r15,%rax,2),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
mulss  %xmm4,%xmm2
cvtss2sd %xmm2,%xmm2
addsd  %xmm1,%xmm2
cvttsd2si %xmm2,%ecx
movswl %cx,%edx
xorps  %xmm2,%xmm2
cvtsi2ss %edx,%xmm2
mov    %cx,(%r15,%rax,2)
addss  %xmm2,%xmm0
add    $0x2,%rax
movaps %xmm0,%xmm2
jmp    1350 <setPFIR+0x220>
movswl 0x3e(%r15),%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm4
xorps  %xmm1,%xmm1
cvtss2sd %xmm4,%xmm1
addsd  0xc4a(%rip),%xmm1
cvttsd2si %xmm1,%eax
mov    %ax,0x3e(%r15)
cwtl
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
addss  %xmm0,%xmm0
addss  %xmm1,%xmm0
mulss  0xc11(%rip),%xmm0
add    $0x138,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define float @setPFIR(i16* %0, float %1, float %2, i32 %3) {
%5 = alloca i16*
%6 = alloca float
%7 = alloca float
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca [63 x float]
%12 = alloca float
%13 = alloca float
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca i32
store i16* %0, i16** %5
store float %1, float* %6
store float %2, float* %7
store i32 %3, i32* %8
store i32 3, i32* %9
store i32 63, i32* %10
%18 = getelementptr inbounds [63 x float], [63 x float]* %11, i64 0, i64 0
%19 = load i32, i32* %10
%20 = call i32 @blackman(float* %18, i32 %19)
store float 0.000000e+00, float* %12
%21 = load i32, i32* %8
%22 = icmp ne i32 %21, 0
br i1 %22, label %23, label %74
23: ; preds = %4
%24 = load float, float* %6
%25 = load float, float* %7
%26 = fdiv float %24, %25
%27 = fdiv float %26, 2.000000e+00
%28 = fpext float %27 to double
store double %28, double* %16
store i32 0, i32* %17
br label %29
29: ; preds = %59, %23
%30 = load i32, i32* %17
%31 = icmp slt i32 %30, 31
br i1 %31, label %32, label %62
32: ; preds = %29
%33 = load i32, i32* %17
%34 = load double, double* %16
%35 = fsub double 3.100000e+01, %34
%36 = fptosi double %35 to i32
%37 = call i32 @ceil(i32 %36)
%38 = icmp sgt i32 %33, %37
br i1 %38, label %39, label %44
39: ; preds = %32
%40 = load i16*, i16** %5
%41 = load i32, i32* %17
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i16, i16* %40, i64 %42
store i16 32767, i16* %43
br label %49
44: ; preds = %32
%45 = load i16*, i16** %5
%46 = load i32, i32* %17
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i16, i16* %45, i64 %47
store i16 0, i16* %48
br label %49
49: ; preds = %44, %39
%50 = load float, float* %12
%51 = load i16*, i16** %5
%52 = load i32, i32* %17
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds i16, i16* %51, i64 %53
%55 = load i16, i16* %54
%56 = sext i16 %55 to i32
%57 = sitofp i32 %56 to float
%58 = fadd float %50, %57
store float %58, float* %12
br label %59
59: ; preds = %49
%60 = load i32, i32* %17
%61 = add nsw i32 %60, 1
store i32 %61, i32* %17
br label %29
62: ; preds = %29
%63 = load i16*, i16** %5
%64 = getelementptr inbounds i16, i16* %63, i64 31
store i16 32767, i16* %64
%65 = load float, float* %12
%66 = load i16*, i16** %5
%67 = getelementptr inbounds i16, i16* %66, i64 31
%68 = load i16, i16* %67
%69 = sext i16 %68 to i32
%70 = sitofp i32 %69 to float
%71 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %65, float %70)
store float %71, float* %12
%72 = load float, float* %12
%73 = fdiv float %72, 6.553600e+04
store float %73, float* %12
br label %144
74: ; preds = %4
%75 = load i32, i32* %9
%76 = sitofp i32 %75 to float
%77 = load float, float* %7
%78 = fmul float %76, %77
%79 = load float, float* %6
%80 = fdiv float %78, %79
%81 = fpext float %80 to double
store double %81, double* %16
store i32 0, i32* %17
br label %82
82: ; preds = %129, %74
%83 = load i32, i32* %17
%84 = icmp slt i32 %83, 31
br i1 %84, label %85, label %132
85: ; preds = %82
%86 = load i32, i32* %17
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds [63 x float], [63 x float]* %11, i64 0, i64 %87
%89 = load float, float* %88
%90 = fmul float 3.276700e+04, %89
%91 = fpext float %90 to double
%92 = load i32, i32* %9
%93 = sitofp i32 %92 to double
%94 = load double, double* %16
%95 = fdiv double %93, %94
%96 = fmul double %91, %95
%97 = load double, double* %16
%98 = load i32, i32* %17
%99 = sitofp i32 %98 to float
%100 = fsub float %99, 3.100000e+01
%101 = fpext float %100 to double
%102 = fmul double %97, %101
%103 = call i32 @sin(double %102)
%104 = sitofp i32 %103 to double
%105 = fmul double %96, %104
%106 = load i32, i32* %9
%107 = sitofp i32 %106 to float
%108 = load i32, i32* %17
%109 = sitofp i32 %108 to float
%110 = fsub float %109, 3.100000e+01
%111 = fmul float %107, %110
%112 = fpext float %111 to double
%113 = fdiv double %105, %112
%114 = fadd double %113, 4.999900e-01
%115 = fptosi double %114 to i16
%116 = load i16*, i16** %5
%117 = load i32, i32* %17
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds i16, i16* %116, i64 %118
store i16 %115, i16* %119
%120 = load float, float* %12
%121 = load i16*, i16** %5
%122 = load i32, i32* %17
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds i16, i16* %121, i64 %123
%125 = load i16, i16* %124
%126 = sext i16 %125 to i32
%127 = sitofp i32 %126 to float
%128 = fadd float %120, %127
store float %128, float* %12
br label %129
129: ; preds = %85
%130 = load i32, i32* %17
%131 = add nsw i32 %130, 1
store i32 %131, i32* %17
br label %82
132: ; preds = %82
%133 = load i16*, i16** %5
%134 = getelementptr inbounds i16, i16* %133, i64 31
store i16 32767, i16* %134
%135 = load float, float* %12
%136 = load i16*, i16** %5
%137 = getelementptr inbounds i16, i16* %136, i64 31
%138 = load i16, i16* %137
%139 = sext i16 %138 to i32
%140 = sitofp i32 %139 to float
%141 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %135, float %140)
store float %141, float* %12
%142 = load float, float* %12
%143 = fdiv float %142, 6.553600e+04
store float %143, float* %12
br label %144
144: ; preds = %132, %62
%145 = load float, float* %12
%146 = fcmp ogt float %145, 1.000000e+00
br i1 %146, label %147, label %203
147: ; preds = %144
%148 = load float, float* %12
store float %148, float* %13
store float 0.000000e+00, float* %12
store i32 0, i32* %17
br label %149
149: ; preds = %178, %147
%150 = load i32, i32* %17
%151 = icmp slt i32 %150, 31
br i1 %151, label %152, label %181
152: ; preds = %149
%153 = load float, float* %13
%154 = fdiv float 1.000000e+00, %153
%155 = load i16*, i16** %5
%156 = load i32, i32* %17
%157 = sext i32 %156 to i64
%158 = getelementptr inbounds i16, i16* %155, i64 %157
%159 = load i16, i16* %158
%160 = sitofp i16 %159 to float
%161 = fmul float %154, %160
%162 = fpext float %161 to double
%163 = fadd double %162, 4.999990e-01
%164 = fptosi double %163 to i16
%165 = load i16*, i16** %5
%166 = load i32, i32* %17
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds i16, i16* %165, i64 %167
store i16 %164, i16* %168
%169 = load float, float* %12
%170 = load i16*, i16** %5
%171 = load i32, i32* %17
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds i16, i16* %170, i64 %172
%174 = load i16, i16* %173
%175 = sext i16 %174 to i32
%176 = sitofp i32 %175 to float
%177 = fadd float %169, %176
store float %177, float* %12
br label %178
178: ; preds = %152
%179 = load i32, i32* %17
%180 = add nsw i32 %179, 1
store i32 %180, i32* %17
br label %149
181: ; preds = %149
%182 = load float, float* %13
%183 = fdiv float 1.000000e+00, %182
%184 = load i16*, i16** %5
%185 = getelementptr inbounds i16, i16* %184, i64 31
%186 = load i16, i16* %185
%187 = sitofp i16 %186 to float
%188 = fmul float %183, %187
%189 = fpext float %188 to double
%190 = fadd double %189, 4.999900e-01
%191 = fptosi double %190 to i16
%192 = load i16*, i16** %5
%193 = getelementptr inbounds i16, i16* %192, i64 31
store i16 %191, i16* %193
%194 = load float, float* %12
%195 = load i16*, i16** %5
%196 = getelementptr inbounds i16, i16* %195, i64 31
%197 = load i16, i16* %196
%198 = sext i16 %197 to i32
%199 = sitofp i32 %198 to float
%200 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %194, float %199)
store float %200, float* %12
%201 = load float, float* %12
%202 = fdiv float %201, 6.553600e+04
store float %202, float* %12
br label %203
203: ; preds = %181, %144
%204 = load float, float* %12
ret float %204
}

LLVM IR (-O2):
define float @setPFIR(i16* nocapture %0, float %1, float %2, i32 %3) {
%5 = alloca [63 x float]
%6 = bitcast [63 x float]* %5 to i8*
%7 = getelementptr inbounds [63 x float], [63 x float]* %5, i64 0, i64 0
%8 = call i32 @blackman(float* %7, i32 63)
%9 = icmp eq i32 %3, 0
br i1 %9, label %37, label %10
10: ; preds = %4
%11 = fdiv float %1, %2
%12 = fmul float %11, 5.000000e-01
%13 = fpext float %12 to double
%14 = fsub double 3.100000e+01, %13
%15 = fptosi double %14 to i32
br label %16
16: ; preds = %28, %10
%17 = phi i64 [ 0, %10 ], [ %36, %28 ]
%18 = phi float [ 0.000000e+00, %10 ], [ %35, %28 ]
%19 = call i32 @ceil(i32 %15)
%20 = sext i32 %19 to i64
%21 = icmp sgt i64 %17, %20
%22 = select i1 %21, i16 32767, i16 0
%23 = getelementptr inbounds i16, i16* %0, i64 %17
store i16 %22, i16* %23
%24 = sitofp i16 %22 to float
%25 = fadd float %18, %24
%26 = or i64 %17, 1
%27 = icmp eq i64 %26, 31
br i1 %27, label %68, label %28
28: ; preds = %16
%29 = call i32 @ceil(i32 %15)
%30 = sext i32 %29 to i64
%31 = icmp slt i64 %17, %30
%32 = select i1 %31, i16 0, i16 32767
%33 = getelementptr inbounds i16, i16* %0, i64 %26
store i16 %32, i16* %33
%34 = sitofp i16 %32 to float
%35 = fadd float %25, %34
%36 = add nuw nsw i64 %17, 2
br label %16
37: ; preds = %4
%38 = fmul float %2, 3.000000e+00
%39 = fdiv float %38, %1
%40 = fpext float %39 to double
%41 = fdiv double 3.000000e+00, %40
br label %42
42: ; preds = %37, %42
%43 = phi i64 [ 0, %37 ], [ %66, %42 ]
%44 = phi float [ 0.000000e+00, %37 ], [ %65, %42 ]
%45 = getelementptr inbounds [63 x float], [63 x float]* %5, i64 0, i64 %43
%46 = load float, float* %45
%47 = fmul float %46, 3.276700e+04
%48 = fpext float %47 to double
%49 = fmul double %41, %48
%50 = trunc i64 %43 to i32
%51 = sitofp i32 %50 to float
%52 = fadd float %51, -3.100000e+01
%53 = fpext float %52 to double
%54 = fmul double %40, %53
%55 = call i32 @sin(double %54)
%56 = sitofp i32 %55 to double
%57 = fmul double %49, %56
%58 = fmul float %52, 3.000000e+00
%59 = fpext float %58 to double
%60 = fdiv double %57, %59
%61 = fadd double %60, 4.999900e-01
%62 = fptosi double %61 to i16
%63 = getelementptr inbounds i16, i16* %0, i64 %43
store i16 %62, i16* %63
%64 = sitofp i16 %62 to float
%65 = fadd float %44, %64
%66 = add nuw nsw i64 %43, 1
%67 = icmp eq i64 %66, 31
br i1 %67, label %68, label %42
68: ; preds = %16, %42
%69 = phi float [ %65, %42 ], [ %25, %16 ]
%70 = getelementptr inbounds i16, i16* %0, i64 31
store i16 32767, i16* %70
%71 = call float @llvm.fmuladd.f32(float %69, float 2.000000e+00, float 3.276700e+04)
%72 = fmul float %71, 0x3EF0000000000000
%73 = fcmp ogt float %72, 1.000000e+00
br i1 %73, label %74, label %112
74: ; preds = %68
%75 = fdiv float 1.000000e+00, %72
br label %76
76: ; preds = %90, %74
%77 = phi i64 [ 0, %74 ], [ %100, %90 ]
%78 = phi float [ 0.000000e+00, %74 ], [ %99, %90 ]
%79 = getelementptr inbounds i16, i16* %0, i64 %77
%80 = load i16, i16* %79
%81 = sitofp i16 %80 to float
%82 = fmul float %75, %81
%83 = fpext float %82 to double
%84 = fadd double %83, 4.999990e-01
%85 = fptosi double %84 to i16
store i16 %85, i16* %79
%86 = sitofp i16 %85 to float
%87 = fadd float %78, %86
%88 = or i64 %77, 1
%89 = icmp eq i64 %88, 31
br i1 %89, label %101, label %90
90: ; preds = %76
%91 = getelementptr inbounds i16, i16* %0, i64 %88
%92 = load i16, i16* %91
%93 = sitofp i16 %92 to float
%94 = fmul float %75, %93
%95 = fpext float %94 to double
%96 = fadd double %95, 4.999990e-01
%97 = fptosi double %96 to i16
store i16 %97, i16* %91
%98 = sitofp i16 %97 to float
%99 = fadd float %87, %98
%100 = add nuw nsw i64 %77, 2
br label %76
101: ; preds = %76
%102 = getelementptr inbounds i16, i16* %0, i64 31
%103 = load i16, i16* %102
%104 = sitofp i16 %103 to float
%105 = fmul float %75, %104
%106 = fpext float %105 to double
%107 = fadd double %106, 4.999900e-01
%108 = fptosi double %107 to i16
store i16 %108, i16* %102
%109 = sitofp i16 %108 to float
%110 = call float @llvm.fmuladd.f32(float %87, float 2.000000e+00, float %109)
%111 = fmul float %110, 0x3EF0000000000000
br label %112
112: ; preds = %101, %68
%113 = phi float [ %111, %101 ], [ %72, %68 ]
ret float %113
}