int ti_fosc(int size, double const *const *inputs, double const *options,
            double *const *outputs) {
  const double *input = inputs[0];
  const int period = (int)options[0];
  double *output = outputs[0];
  if (period < 1)
    return 1;
  if (size <= ti_fosc_start(options))
    return 0;
  do {
    double x = 0;
    double x2 = 0;
    double y = 0;
    double xy = 0;
    const double p = (1.0 / (period));
    double tsf = 0;
    ;
    int i;
    for (i = 0; i < (period)-1; ++i) {
      x += i + 1;
      x2 += (i + 1) * (i + 1);
      xy += (input)[i] * (i + 1);
      y += (input)[i];
    }
    x += (period);
    x2 += (period) * (period);
    const double bd = 1.0 / ((period)*x2 - x * x);
    for (i = (period)-1; i < (size); ++i) {
      xy += (input)[i] * (period);
      y += (input)[i];
      const double b = ((period)*xy - x * y) * bd;
      do {
        const double a = (y - b * x) * p;
        if (i >= (period)) {
          *output++ = 100 * (input[i] - tsf) / input[i];
        }
        tsf = (a + b * ((period + 1)));
      } while (0);
      xy -= y;
      y -= (input)[i - (period) + 1];
    }
  } while (0);
  assert(output - outputs[0] == size - ti_fosc_start(options));
  return 0;
}


x86 assembly (clang, -O0):
<ti_fosc>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x38(%rbp)
cmpl   $0x1,-0x2c(%rbp)
jge    1171 <ti_fosc+0x51>
movl   $0x1,-0x4(%rbp)
jmp    14bc <ti_fosc+0x39c>
mov    -0x8(%rbp),%eax
mov    %eax,-0x8c(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1030 <ti_fosc_start@plt>
mov    %eax,%ecx
mov    -0x8c(%rbp),%eax
cmp    %ecx,%eax
jg     11a1 <ti_fosc+0x81>
movl   $0x0,-0x4(%rbp)
jmp    14bc <ti_fosc+0x39c>
jmp    11a6 <ti_fosc+0x86>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x48(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x50(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
cvtsi2sdl -0x2c(%rbp),%xmm1
movsd  0xe2d(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
movl   $0x0,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
mov    -0x2c(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    127b <ti_fosc+0x15b>
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    -0x6c(%rbp),%ecx
add    $0x1,%ecx
imul   %ecx,%eax
cvtsi2sd %eax,%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    11eb <ti_fosc+0xcb>
cvtsi2sdl -0x2c(%rbp),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x2c(%rbp),%eax
imul   -0x2c(%rbp),%eax
cvtsi2sd %eax,%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
cvtsi2sdl -0x2c(%rbp),%xmm1
movsd  -0x48(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0xd26(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x2c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    145d <ti_fosc+0x33d>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
cvtsi2sdl -0x2c(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
cvtsi2sdl -0x2c(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm1
mulsd  -0x50(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x80(%rbp),%xmm0
movsd  -0x40(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mulsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x6c(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     13f5 <ti_fosc+0x2d5>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
subsd  -0x68(%rbp),%xmm1
movsd  0xc37(%rip),%xmm0
mulsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x38(%rbp)
movsd  %xmm0,(%rax)
movsd  -0x88(%rbp),%xmm1
ff
movsd  -0x80(%rbp),%xmm0
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x50(%rbp),%xmm1
movsd  -0x58(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    -0x2c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x50(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    12ec <ti_fosc+0x1cc>
jmp    1462 <ti_fosc+0x342>
mov    -0x38(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
sub    %rcx,%rax
sar    $0x3,%rax
mov    %rax,-0x98(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x9c(%rbp)
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1030 <ti_fosc_start@plt>
mov    -0x9c(%rbp),%ecx
mov    %eax,%edx
mov    -0x98(%rbp),%rax
sub    %edx,%ecx
movslq %ecx,%rcx
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
mov    $0x0,%al
call   1040 <assert@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ti_fosc>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
cvttsd2si (%rdx),%r15d
test   %r15d,%r15d
jle    1196 <ti_fosc+0x76>
mov    %rdx,%r14
mov    %edi,%r12d
mov    (%rsi),%rbx
mov    %rcx,(%rsp)
mov    (%rcx),%r13
xor    %ebp,%ebp
mov    %rdx,%rdi
xor    %eax,%eax
call   1030 <ti_fosc_start@plt>
cmp    %r12d,%eax
jge    1287 <ti_fosc+0x167>
lea    -0x1(%r15),%eax
xorpd  %xmm3,%xmm3
xorpd  %xmm1,%xmm1
xorpd  %xmm7,%xmm7
xorpd  %xmm0,%xmm0
cmp    $0x2,%r15d
jb     1255 <ti_fosc+0x135>
mov    %eax,%edx
cmp    $0x1,%eax
jne    11a0 <ti_fosc+0x80>
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
xorpd  %xmm7,%xmm7
xorpd  %xmm1,%xmm1
xorpd  %xmm3,%xmm3
jmp    1223 <ti_fosc+0x103>
mov    $0x1,%ebp
jmp    1287 <ti_fosc+0x167>
mov    %edx,%esi
and    $0xfffffffe,%esi
xorpd  %xmm0,%xmm0
xor    %ecx,%ecx
xorpd  %xmm7,%xmm7
xorpd  %xmm1,%xmm1
xorpd  %xmm3,%xmm3
nopw   0x0(%rax,%rax,1)
lea    0x1(%rcx),%edi
xorps  %xmm2,%xmm2
cvtsi2sd %edi,%xmm2
addsd  %xmm2,%xmm0
imul   %edi,%edi
xorps  %xmm4,%xmm4
cvtsi2sd %edi,%xmm4
addsd  %xmm3,%xmm4
movsd  (%rbx,%rcx,8),%xmm3
movsd  0x8(%rbx,%rcx,8),%xmm5
mulsd  %xmm3,%xmm2
addsd  %xmm7,%xmm2
addsd  %xmm3,%xmm1
add    $0x2,%rcx
xorps  %xmm7,%xmm7
cvtsi2sd %ecx,%xmm7
addsd  %xmm7,%xmm0
mov    %ecx,%edi
imul   %ecx,%edi
xorps  %xmm3,%xmm3
cvtsi2sd %edi,%xmm3
addsd  %xmm4,%xmm3
mulsd  %xmm5,%xmm7
addsd  %xmm2,%xmm7
addsd  %xmm5,%xmm1
cmp    %rcx,%rsi
jne    11c0 <ti_fosc+0xa0>
test   $0x1,%dl
je     1255 <ti_fosc+0x135>
lea    0x1(%rcx),%edx
xorps  %xmm2,%xmm2
cvtsi2sd %edx,%xmm2
addsd  %xmm2,%xmm0
imul   %edx,%edx
xorps  %xmm4,%xmm4
cvtsi2sd %edx,%xmm4
addsd  %xmm4,%xmm3
movsd  (%rbx,%rcx,8),%xmm4
mulsd  %xmm4,%xmm2
addsd  %xmm2,%xmm7
addsd  %xmm4,%xmm1
cmp    %r12d,%r15d
jle    1298 <ti_fosc+0x178>
mov    (%rsp),%rax
sub    (%rax),%r13
sar    $0x3,%r13
xor    %ebp,%ebp
mov    %r14,%rdi
xor    %eax,%eax
call   1030 <ti_fosc_start@plt>
sub    %eax,%r12d
movslq %r12d,%rax
xor    %edi,%edi
cmp    %rax,%r13
sete   %dil
xor    %eax,%eax
call   1040 <assert@plt>
mov    %ebp,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xorps  %xmm5,%xmm5
cvtsi2sd %r15d,%xmm5
movsd  0xd57(%rip),%xmm10
movapd %xmm10,%xmm9
divsd  %xmm5,%xmm9
addsd  %xmm5,%xmm0
mov    %r15d,%ecx
imul   %r15d,%ecx
xorps  %xmm2,%xmm2
cvtsi2sd %ecx,%xmm2
addsd  %xmm2,%xmm3
movapd 0xd3e(%rip),%xmm11
xorpd  %xmm0,%xmm11
movapd %xmm0,%xmm2
mulsd  %xmm0,%xmm2
mulsd  %xmm5,%xmm3
subsd  %xmm2,%xmm3
divsd  %xmm3,%xmm10
lea    0x1(%r15),%ecx
xorps  %xmm3,%xmm3
cvtsi2sd %ecx,%xmm3
cltq
movslq %r15d,%rcx
lea    (%rbx,%rax,8),%rdx
mov    %r12d,%esi
sub    %r15d,%esi
add    $0x1,%esi
xorpd  %xmm4,%xmm4
xor    %edi,%edi
movsd  0xcf0(%rip),%xmm8
jmp    137f <ti_fosc+0x25f>
nopw   0x0(%rax,%rax,1)
addsd  %xmm6,%xmm1
mulsd  %xmm5,%xmm6
addsd  %xmm7,%xmm6
movapd %xmm1,%xmm2
mulsd  %xmm11,%xmm2
movapd %xmm5,%xmm4
mulsd  %xmm6,%xmm4
addsd  %xmm2,%xmm4
mulsd  %xmm10,%xmm4
movapd %xmm4,%xmm2
mulsd  %xmm0,%xmm2
movapd %xmm1,%xmm7
subsd  %xmm2,%xmm7
mulsd  %xmm9,%xmm7
mulsd  %xmm3,%xmm4
addsd  %xmm7,%xmm4
subsd  %xmm1,%xmm6
movslq %edi,%rbp
subsd  (%rbx,%rbp,8),%xmm1
add    $0x1,%rdi
movapd %xmm6,%xmm7
cmp    %edi,%esi
je     125a <ti_fosc+0x13a>
lea    (%rax,%rdi,1),%rbp
movsd  (%rdx,%rdi,8),%xmm6
cmp    %rcx,%rbp
jl     1320 <ti_fosc+0x200>
movapd %xmm6,%xmm2
subsd  %xmm4,%xmm2
mulsd  %xmm8,%xmm2
divsd  %xmm6,%xmm2
movsd  %xmm2,0x0(%r13)
add    $0x8,%r13
jmp    1320 <ti_fosc+0x200>

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

LLVM IR (-O2):
define i32 @ti_fosc(i32 %0, double** nocapture %1, double* %2, double** nocapture %3) {
%5 = load double*, double** %1
%6 = load double, double* %2
%7 = fptosi double %6 to i32
%8 = load double*, double** %3
%9 = icmp slt i32 %7, 1
br i1 %9, label %146, label %10
10: ; preds = %4
%11 = tail call i32 (double*, ...) bitcast (i32 (...)* @ti_fosc_start to i32 (double*, ...)*)(double* %2)
%12 = icmp slt i32 %11, %0
br i1 %12, label %13, label %146
13: ; preds = %10
%14 = sitofp i32 %7 to double
%15 = fdiv double 1.000000e+00, %14
%16 = add nsw i32 %7, -1
%17 = icmp ugt i32 %7, 1
br i1 %17, label %18, label %78
18: ; preds = %13
%19 = zext i32 %16 to i64
%20 = and i64 %19, 1
%21 = icmp eq i32 %16, 1
br i1 %21, label %55, label %22
22: ; preds = %18
%23 = and i64 %19, 4294967294
br label %24
24: ; preds = %24, %22
%25 = phi i64 [ 0, %22 ], [ %42, %24 ]
%26 = phi double [ 0.000000e+00, %22 ], [ %45, %24 ]
%27 = phi double [ 0.000000e+00, %22 ], [ %51, %24 ]
%28 = phi double [ 0.000000e+00, %22 ], [ %52, %24 ]
%29 = phi double [ 0.000000e+00, %22 ], [ %48, %24 ]
%30 = phi i64 [ 0, %22 ], [ %53, %24 ]
%31 = or i64 %25, 1
%32 = trunc i64 %31 to i32
%33 = sitofp i32 %32 to double
%34 = fadd double %26, %33
%35 = mul nsw i32 %32, %32
%36 = sitofp i32 %35 to double
%37 = fadd double %29, %36
%38 = getelementptr inbounds double, double* %5, i64 %25
%39 = load double, double* %38
%40 = tail call double @llvm.fmuladd.f64(double %39, double %33, double %27)
%41 = fadd double %28, %39
%42 = add nuw nsw i64 %25, 2
%43 = trunc i64 %42 to i32
%44 = sitofp i32 %43 to double
%45 = fadd double %34, %44
%46 = mul nsw i32 %43, %43
%47 = sitofp i32 %46 to double
%48 = fadd double %37, %47
%49 = getelementptr inbounds double, double* %5, i64 %31
%50 = load double, double* %49
%51 = tail call double @llvm.fmuladd.f64(double %50, double %44, double %40)
%52 = fadd double %41, %50
%53 = add i64 %30, 2
%54 = icmp eq i64 %53, %23
br i1 %54, label %55, label %24
55: ; preds = %24, %18
%56 = phi double [ undef, %18 ], [ %45, %24 ]
%57 = phi double [ undef, %18 ], [ %48, %24 ]
%58 = phi double [ undef, %18 ], [ %51, %24 ]
%59 = phi double [ undef, %18 ], [ %52, %24 ]
%60 = phi i64 [ 0, %18 ], [ %42, %24 ]
%61 = phi double [ 0.000000e+00, %18 ], [ %45, %24 ]
%62 = phi double [ 0.000000e+00, %18 ], [ %51, %24 ]
%63 = phi double [ 0.000000e+00, %18 ], [ %52, %24 ]
%64 = phi double [ 0.000000e+00, %18 ], [ %48, %24 ]
%65 = icmp eq i64 %20, 0
br i1 %65, label %78, label %66
66: ; preds = %55
%67 = trunc i64 %60 to i32
%68 = add i32 %67, 1
%69 = sitofp i32 %68 to double
%70 = fadd double %61, %69
%71 = mul nsw i32 %68, %68
%72 = sitofp i32 %71 to double
%73 = fadd double %64, %72
%74 = getelementptr inbounds double, double* %5, i64 %60
%75 = load double, double* %74
%76 = tail call double @llvm.fmuladd.f64(double %75, double %69, double %62)
%77 = fadd double %63, %75
br label %78
78: ; preds = %66, %55, %13
%79 = phi double [ 0.000000e+00, %13 ], [ %57, %55 ], [ %73, %66 ]
%80 = phi double [ 0.000000e+00, %13 ], [ %59, %55 ], [ %77, %66 ]
%81 = phi double [ 0.000000e+00, %13 ], [ %58, %55 ], [ %76, %66 ]
%82 = phi double [ 0.000000e+00, %13 ], [ %56, %55 ], [ %70, %66 ]
%83 = fadd double %82, %14
%84 = mul nsw i32 %7, %7
%85 = sitofp i32 %84 to double
%86 = fadd double %79, %85
%87 = fneg double %83
%88 = fmul double %83, %87
%89 = tail call double @llvm.fmuladd.f64(double %14, double %86, double %88)
%90 = fdiv double 1.000000e+00, %89
%91 = icmp sgt i32 %7, %0
br i1 %91, label %133, label %92
92: ; preds = %78
%93 = add nsw i32 %7, 1
%94 = sitofp i32 %93 to double
%95 = sub i32 1, %7
%96 = sext i32 %16 to i64
%97 = sext i32 %7 to i64
br label %98
98: ; preds = %92, %120
%99 = phi i64 [ %96, %92 ], [ %130, %120 ]
%100 = phi double* [ %8, %92 ], [ %121, %120 ]
%101 = phi double [ 0.000000e+00, %92 ], [ %122, %120 ]
%102 = phi double [ %81, %92 ], [ %123, %120 ]
%103 = phi double [ %80, %92 ], [ %129, %120 ]
%104 = getelementptr inbounds double, double* %5, i64 %99
%105 = load double, double* %104
%106 = tail call double @llvm.fmuladd.f64(double %105, double %14, double %102)
%107 = fadd double %103, %105
%108 = fmul double %107, %87
%109 = tail call double @llvm.fmuladd.f64(double %14, double %106, double %108)
%110 = fmul double %90, %109
%111 = fneg double %110
%112 = tail call double @llvm.fmuladd.f64(double %111, double %83, double %107)
%113 = fmul double %15, %112
%114 = icmp slt i64 %99, %97
br i1 %114, label %120, label %115
115: ; preds = %98
%116 = fsub double %105, %101
%117 = fmul double %116, 1.000000e+02
%118 = fdiv double %117, %105
%119 = getelementptr inbounds double, double* %100, i64 1
store double %118, double* %100
br label %120
120: ; preds = %115, %98
%121 = phi double* [ %119, %115 ], [ %100, %98 ]
%122 = tail call double @llvm.fmuladd.f64(double %110, double %94, double %113)
%123 = fsub double %106, %107
%124 = trunc i64 %99 to i32
%125 = add i32 %95, %124
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds double, double* %5, i64 %126
%128 = load double, double* %127
%129 = fsub double %107, %128
%130 = add nsw i64 %99, 1
%131 = trunc i64 %130 to i32
%132 = icmp eq i32 %131, %0
br i1 %132, label %133, label %98
133: ; preds = %120, %78
%134 = phi double* [ %8, %78 ], [ %121, %120 ]
%135 = load double*, double** %3
%136 = ptrtoint double* %134 to i64
%137 = ptrtoint double* %135 to i64
%138 = sub i64 %136, %137
%139 = ashr exact i64 %138, 3
%140 = tail call i32 (double*, ...) bitcast (i32 (...)* @ti_fosc_start to i32 (double*, ...)*)(double* %2)
%141 = sub nsw i32 %0, %140
%142 = sext i32 %141 to i64
%143 = icmp eq i64 %139, %142
%144 = zext i1 %143 to i32
%145 = tail call i32 (i32, ...) bitcast (i32 (...)* @assert to i32 (i32, ...)*)(i32 %144)
br label %146
146: ; preds = %10, %4, %133
%147 = phi i32 [ 0, %133 ], [ 1, %4 ], [ 0, %10 ]
ret i32 %147
}