#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*/ assert(int);
int ti_aroon_start(double const *);
int ti_aroonosc_start(double const *);
int ti_aroonosc(int size, double const *const *inputs, double const *options,
                double *const *outputs) {
  const double *high = inputs[0];
  const double *low = inputs[1];
  double *output = outputs[0];
  const int period = (int)options[0];
  if (period < 1)
    return 1;
  if (size <= ti_aroon_start(options))
    return 0;
  const double scale = 100.0 / period;
  int trail = 0, maxi = -1, mini = -1;
  double max = high[0];
  double min = low[0];
  int i, j;
  for (i = period; i < size; ++i, ++trail) {
    double bar = high[i];
    if (maxi < trail) {
      maxi = trail;
      max = high[maxi];
      j = trail;
      while (++j <= i) {
        bar = high[j];
        if (bar >= max) {
          max = bar;
          maxi = j;
        }
      }
    } else if (bar >= max) {
      maxi = i;
      max = bar;
    }
    bar = low[i];
    if (mini < trail) {
      mini = trail;
      min = low[mini];
      j = trail;
      while (++j <= i) {
        bar = low[j];
        if (bar <= min) {
          min = bar;
          mini = j;
        }
      }
    } else if (bar <= min) {
      mini = i;
      min = bar;
    }
    *output++ = (maxi - mini) * scale;
  }
  assert(output - outputs[0] == size - ti_aroonosc_start(options));
  return 0;
}


x86 assembly (clang, -O0):
<ti_aroonosc>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%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    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
cvttsd2si (%rax),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x1,-0x3c(%rbp)
jge    118d <ti_aroonosc+0x5d>
movl   $0x1,-0x4(%rbp)
jmp    1401 <ti_aroonosc+0x2d1>
mov    -0x8(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x18(%rbp),%rdi
call   1050 <ti_aroon_start@plt>
mov    %eax,%ecx
mov    -0x7c(%rbp),%eax
cmp    %ecx,%eax
jg     11b5 <ti_aroonosc+0x85>
movl   $0x0,-0x4(%rbp)
jmp    1401 <ti_aroonosc+0x2d1>
cvtsi2sdl -0x3c(%rbp),%xmm1
movsd  0xe3e(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
movl   $0xffffffff,-0x50(%rbp)
movl   $0xffffffff,-0x54(%rbp)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    13ab <ti_aroonosc+0x27b>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jge    1296 <ti_aroonosc+0x166>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x70(%rbp)
mov    -0x70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
cmp    -0x6c(%rbp),%eax
jg     1291 <ti_aroonosc+0x161>
mov    -0x28(%rbp),%rax
movslq -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
ucomisd -0x60(%rbp),%xmm0
jb     128c <ti_aroonosc+0x15c>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x70(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    1248 <ti_aroonosc+0x118>
jmp    12bb <ti_aroonosc+0x18b>
movsd  -0x78(%rbp),%xmm0
ucomisd -0x60(%rbp),%xmm0
jb     12b6 <ti_aroonosc+0x186>
mov    -0x6c(%rbp),%eax
mov    %eax,-0x50(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    12bb <ti_aroonosc+0x18b>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x4c(%rbp),%eax
jge    1349 <ti_aroonosc+0x219>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x70(%rbp)
mov    -0x70(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x70(%rbp)
cmp    -0x6c(%rbp),%eax
jg     1344 <ti_aroonosc+0x214>
mov    -0x30(%rbp),%rax
movslq -0x70(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     133f <ti_aroonosc+0x20f>
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x70(%rbp),%eax
mov    %eax,-0x54(%rbp)
jmp    12f7 <ti_aroonosc+0x1c7>
jmp    1372 <ti_aroonosc+0x242>
movsd  -0x78(%rbp),%xmm1
movsd  -0x68(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     136d <ti_aroonosc+0x23d>
mov    -0x6c(%rbp),%eax
mov    %eax,-0x54(%rbp)
movsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    1372 <ti_aroonosc+0x242>
mov    -0x50(%rbp),%eax
sub    -0x54(%rbp),%eax
cvtsi2sd %eax,%xmm0
mulsd  -0x48(%rbp),%xmm0
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x38(%rbp)
movsd  %xmm0,(%rax)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1200 <ti_aroonosc+0xd0>
mov    -0x38(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
sub    %rcx,%rax
sar    $0x3,%rax
mov    %rax,-0x88(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x8c(%rbp)
mov    -0x18(%rbp),%rdi
call   1030 <ti_aroonosc_start@plt>
mov    -0x8c(%rbp),%ecx
mov    %eax,%edx
mov    -0x88(%rbp),%rax
sub    %edx,%ecx
movslq %ecx,%rcx
cmp    %rcx,%rax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1040 <assert@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ti_aroonosc>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
cvttsd2si (%rdx),%r13d
test   %r13d,%r13d
jle    1527 <ti_aroonosc+0x3f7>
mov    %rdx,%rbp
mov    %edi,%ebx
mov    (%rsi),%r15
mov    0x8(%rsi),%r14
mov    (%rcx),%r12
mov    %rdx,%rdi
mov    %rcx,0x20(%rsp)
call   1050 <ti_aroon_start@plt>
xor    %ecx,%ecx
cmp    %ebx,%eax
jge    155d <ti_aroonosc+0x42d>
mov    %rbp,0x18(%rsp)
cmp    %ebx,%r13d
mov    %ebx,0x4(%rsp)
jge    152e <ti_aroonosc+0x3fe>
cvtsi2sd %r13d,%xmm1
movsd  0xe6f(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  (%r14),%xmm1
movsd  (%r15),%xmm2
mov    %r13d,%r10d
mov    %ebx,%eax
sub    %r13d,%eax
mov    %rax,0x28(%rsp)
lea    0x8(%r15),%r8
and    $0x3,%r13d
lea    0x8(%r14),%r9
mov    $0xffffffff,%ebx
mov    $0x1,%edi
xor    %esi,%esi
xor    %r11d,%r11d
mov    $0xffffffff,%ebp
jmp    1214 <ti_aroonosc+0xe4>
xchg   %ax,%ax
mov    %r11d,%ebx
mov    %ebp,%eax
sub    %ebx,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  %xmm0,%xmm3
movsd  %xmm3,(%r12)
add    $0x8,%r12
add    $0x1,%r10
add    $0x1,%r11
mov    0x10(%rsp),%rsi
add    $0xffffffffffffffff,%rsi
add    $0x1,%rdi
add    $0x8,%r8
add    $0x8,%r9
cmp    0x28(%rsp),%r11
je     152e <ti_aroonosc+0x3fe>
mov    %r10d,%eax
mov    %r10,%rdx
sub    %r11,%rdx
mov    %r11,%rcx
not    %rcx
add    %rax,%rcx
mov    %rcx,0x8(%rsp)
movslq %ebp,%rcx
cmp    %rcx,%r11
mov    %rsi,0x10(%rsp)
mov    %rdx,0x30(%rsp)
jle    12c0 <ti_aroonosc+0x190>
movsd  (%r15,%r11,8),%xmm2
cmp    %r11,%r10
jbe    12e0 <ti_aroonosc+0x1b0>
test   $0x3,%dl
je     12e8 <ti_aroonosc+0x1b8>
mov    %r12,%rdx
mov    %r11d,%ebp
xor    %ecx,%ecx
movapd %xmm2,%xmm3
cs nopw 0x0(%rax,%rax,1)
nop
movsd  (%r8,%rcx,8),%xmm4
lea    (%rdi,%rcx,1),%r12d
ucomisd %xmm2,%xmm4
cmovae %r12d,%ebp
cmpnlesd %xmm4,%xmm3
movapd %xmm3,%xmm5
andnpd %xmm4,%xmm5
andpd  %xmm2,%xmm3
orpd   %xmm5,%xmm3
movapd %xmm3,%xmm2
add    $0x1,%rcx
cmp    %rcx,%r13
jne    1270 <ti_aroonosc+0x140>
sub    %rsi,%rcx
mov    %rdx,%r12
cmpq   $0x3,0x8(%rsp)
jae    1300 <ti_aroonosc+0x1d0>
jmp    13c0 <ti_aroonosc+0x290>
nopw   0x0(%rax,%rax,1)
movsd  (%r15,%r10,8),%xmm3
ucomisd %xmm2,%xmm3
jb     13c0 <ti_aroonosc+0x290>
mov    %r10d,%ebp
movapd %xmm3,%xmm2
jmp    13c0 <ti_aroonosc+0x290>
nopl   0x0(%rax)
mov    %r11d,%ebp
jmp    13c0 <ti_aroonosc+0x290>
mov    %r11,%rcx
mov    %r11d,%ebp
cmpq   $0x3,0x8(%rsp)
jb     13c0 <ti_aroonosc+0x290>
nopw   0x0(%rax,%rax,1)
lea    0x1(%rcx),%edx
movsd  0x8(%r15,%rcx,8),%xmm3
ucomisd %xmm2,%xmm3
cmovb  %ebp,%edx
movsd  0x10(%r15,%rcx,8),%xmm4
movapd %xmm2,%xmm5
cmpnlesd %xmm3,%xmm5
movapd %xmm5,%xmm6
andnpd %xmm3,%xmm6
andpd  %xmm2,%xmm5
orpd   %xmm6,%xmm5
lea    0x2(%rcx),%esi
ucomisd %xmm5,%xmm4
cmovb  %edx,%esi
movapd %xmm5,%xmm2
cmpnlesd %xmm4,%xmm2
movapd %xmm2,%xmm3
andpd  %xmm5,%xmm3
andnpd %xmm4,%xmm2
orpd   %xmm3,%xmm2
movsd  0x18(%r15,%rcx,8),%xmm3
lea    0x3(%rcx),%ebp
ucomisd %xmm2,%xmm3
cmovb  %esi,%ebp
movapd %xmm2,%xmm4
cmpnlesd %xmm3,%xmm4
movapd %xmm4,%xmm5
andpd  %xmm2,%xmm5
andnpd %xmm3,%xmm4
orpd   %xmm5,%xmm4
movsd  0x20(%r15,%rcx,8),%xmm3
add    $0x4,%rcx
ucomisd %xmm4,%xmm3
cmovae %ecx,%ebp
movapd %xmm4,%xmm2
cmpnlesd %xmm3,%xmm2
movapd %xmm2,%xmm5
andpd  %xmm4,%xmm5
andnpd %xmm3,%xmm2
orpd   %xmm5,%xmm2
cmp    %rcx,%rax
jne    1300 <ti_aroonosc+0x1d0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movslq %ebx,%rcx
cmp    %rcx,%r11
jle    1440 <ti_aroonosc+0x310>
movsd  (%r14,%r11,8),%xmm1
cmp    %r11,%r10
jbe    11d0 <ti_aroonosc+0xa0>
testb  $0x3,0x30(%rsp)
je     145c <ti_aroonosc+0x32c>
mov    %r11d,%ebx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%r9,%rcx,8),%xmm3
lea    (%rdi,%rcx,1),%edx
ucomisd %xmm3,%xmm1
cmovae %edx,%ebx
movapd %xmm3,%xmm4
cmpnlesd %xmm1,%xmm4
movapd %xmm4,%xmm5
andnpd %xmm3,%xmm5
andpd  %xmm1,%xmm4
orpd   %xmm5,%xmm4
movapd %xmm4,%xmm1
add    $0x1,%rcx
cmp    %rcx,%r13
jne    13f0 <ti_aroonosc+0x2c0>
sub    0x10(%rsp),%rcx
cmpq   $0x3,0x8(%rsp)
jae    1470 <ti_aroonosc+0x340>
jmp    11d3 <ti_aroonosc+0xa3>
nopl   0x0(%rax,%rax,1)
movsd  (%r14,%r10,8),%xmm3
ucomisd %xmm3,%xmm1
jb     11d3 <ti_aroonosc+0xa3>
mov    %r10d,%ebx
movapd %xmm3,%xmm1
jmp    11d3 <ti_aroonosc+0xa3>
mov    %r11,%rcx
mov    %r11d,%ebx
cmpq   $0x3,0x8(%rsp)
jb     11d3 <ti_aroonosc+0xa3>
xchg   %ax,%ax
lea    0x1(%rcx),%edx
movsd  0x8(%r14,%rcx,8),%xmm3
ucomisd %xmm3,%xmm1
cmovb  %ebx,%edx
movsd  0x10(%r14,%rcx,8),%xmm4
movapd %xmm3,%xmm5
cmpnlesd %xmm1,%xmm5
movapd %xmm5,%xmm6
andnpd %xmm3,%xmm6
andpd  %xmm1,%xmm5
orpd   %xmm6,%xmm5
lea    0x2(%rcx),%esi
ucomisd %xmm4,%xmm5
cmovb  %edx,%esi
movapd %xmm4,%xmm1
cmpnlesd %xmm5,%xmm1
movapd %xmm1,%xmm3
andpd  %xmm5,%xmm3
andnpd %xmm4,%xmm1
orpd   %xmm3,%xmm1
movsd  0x18(%r14,%rcx,8),%xmm3
lea    0x3(%rcx),%ebx
ucomisd %xmm3,%xmm1
cmovb  %esi,%ebx
movapd %xmm3,%xmm4
cmpnlesd %xmm1,%xmm4
movapd %xmm4,%xmm5
andpd  %xmm1,%xmm5
andnpd %xmm3,%xmm4
orpd   %xmm5,%xmm4
movsd  0x20(%r14,%rcx,8),%xmm3
add    $0x4,%rcx
ucomisd %xmm3,%xmm4
cmovae %ecx,%ebx
movapd %xmm3,%xmm1
cmpnlesd %xmm4,%xmm1
movapd %xmm1,%xmm5
andpd  %xmm4,%xmm5
andnpd %xmm3,%xmm1
orpd   %xmm5,%xmm1
cmp    %rcx,%rax
jne    1470 <ti_aroonosc+0x340>
jmp    11d3 <ti_aroonosc+0xa3>
mov    $0x1,%ecx
jmp    155d <ti_aroonosc+0x42d>
mov    0x20(%rsp),%rax
sub    (%rax),%r12
sar    $0x3,%r12
mov    0x18(%rsp),%rdi
call   1030 <ti_aroonosc_start@plt>
mov    0x4(%rsp),%ecx
sub    %eax,%ecx
movslq %ecx,%rax
xor    %edi,%edi
cmp    %rax,%r12
sete   %dil
call   1040 <assert@plt>
xor    %ecx,%ecx
mov    %ecx,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @ti_aroonosc(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 double*
%12 = alloca double*
%13 = alloca i32
%14 = alloca double
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca double
%19 = alloca double
%20 = alloca i32
%21 = alloca i32
%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*** %7
%27 = getelementptr inbounds double*, double** %26, i64 1
%28 = load double*, double** %27
store double* %28, double** %11
%29 = load double**, double*** %9
%30 = getelementptr inbounds double*, double** %29, i64 0
%31 = load double*, double** %30
store double* %31, double** %12
%32 = load double*, double** %8
%33 = getelementptr inbounds double, double* %32, i64 0
%34 = load double, double* %33
%35 = fptosi double %34 to i32
store i32 %35, i32* %13
%36 = load i32, i32* %13
%37 = icmp slt i32 %36, 1
br i1 %37, label %38, label %39
38: ; preds = %4
store i32 1, i32* %5
br label %179
39: ; preds = %4
%40 = load i32, i32* %6
%41 = load double*, double** %8
%42 = call i32 @ti_aroon_start(double* %41)
%43 = icmp sle i32 %40, %42
br i1 %43, label %44, label %45
44: ; preds = %39
store i32 0, i32* %5
br label %179
45: ; preds = %39
%46 = load i32, i32* %13
%47 = sitofp i32 %46 to double
%48 = fdiv double 1.000000e+02, %47
store double %48, double* %14
store i32 0, i32* %15
store i32 -1, i32* %16
store i32 -1, i32* %17
%49 = load double*, double** %10
%50 = getelementptr inbounds double, double* %49, i64 0
%51 = load double, double* %50
store double %51, double* %18
%52 = load double*, double** %11
%53 = getelementptr inbounds double, double* %52, i64 0
%54 = load double, double* %53
store double %54, double* %19
%55 = load i32, i32* %13
store i32 %55, i32* %20
br label %56
56: ; preds = %157, %45
%57 = load i32, i32* %20
%58 = load i32, i32* %6
%59 = icmp slt i32 %57, %58
br i1 %59, label %60, label %162
60: ; preds = %56
%61 = load double*, double** %10
%62 = load i32, i32* %20
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds double, double* %61, i64 %63
%65 = load double, double* %64
store double %65, double* %22
%66 = load i32, i32* %16
%67 = load i32, i32* %15
%68 = icmp slt i32 %66, %67
br i1 %68, label %69, label %96
69: ; preds = %60
%70 = load i32, i32* %15
store i32 %70, i32* %16
%71 = load double*, double** %10
%72 = load i32, i32* %16
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds double, double* %71, i64 %73
%75 = load double, double* %74
store double %75, double* %18
%76 = load i32, i32* %15
store i32 %76, i32* %21
br label %77
77: ; preds = %94, %69
%78 = load i32, i32* %21
%79 = add nsw i32 %78, 1
store i32 %79, i32* %21
%80 = load i32, i32* %20
%81 = icmp sle i32 %79, %80
br i1 %81, label %82, label %95
82: ; preds = %77
%83 = load double*, double** %10
%84 = load i32, i32* %21
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds double, double* %83, i64 %85
%87 = load double, double* %86
store double %87, double* %22
%88 = load double, double* %22
%89 = load double, double* %18
%90 = fcmp oge double %88, %89
br i1 %90, label %91, label %94
91: ; preds = %82
%92 = load double, double* %22
store double %92, double* %18
%93 = load i32, i32* %21
store i32 %93, i32* %16
br label %94
94: ; preds = %91, %82
br label %77
95: ; preds = %77
br label %104
96: ; preds = %60
%97 = load double, double* %22
%98 = load double, double* %18
%99 = fcmp oge double %97, %98
br i1 %99, label %100, label %103
100: ; preds = %96
%101 = load i32, i32* %20
store i32 %101, i32* %16
%102 = load double, double* %22
store double %102, double* %18
br label %103
103: ; preds = %100, %96
br label %104
104: ; preds = %103, %95
%105 = load double*, double** %11
%106 = load i32, i32* %20
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds double, double* %105, i64 %107
%109 = load double, double* %108
store double %109, double* %22
%110 = load i32, i32* %17
%111 = load i32, i32* %15
%112 = icmp slt i32 %110, %111
br i1 %112, label %113, label %140
113: ; preds = %104
%114 = load i32, i32* %15
store i32 %114, i32* %17
%115 = load double*, double** %11
%116 = load i32, i32* %17
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds double, double* %115, i64 %117
%119 = load double, double* %118
store double %119, double* %19
%120 = load i32, i32* %15
store i32 %120, i32* %21
br label %121
121: ; preds = %138, %113
%122 = load i32, i32* %21
%123 = add nsw i32 %122, 1
store i32 %123, i32* %21
%124 = load i32, i32* %20
%125 = icmp sle i32 %123, %124
br i1 %125, label %126, label %139
126: ; preds = %121
%127 = load double*, double** %11
%128 = load i32, i32* %21
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds double, double* %127, i64 %129
%131 = load double, double* %130
store double %131, double* %22
%132 = load double, double* %22
%133 = load double, double* %19
%134 = fcmp ole double %132, %133
br i1 %134, label %135, label %138
135: ; preds = %126
%136 = load double, double* %22
store double %136, double* %19
%137 = load i32, i32* %21
store i32 %137, i32* %17
br label %138
138: ; preds = %135, %126
br label %121
139: ; preds = %121
br label %148
140: ; preds = %104
%141 = load double, double* %22
%142 = load double, double* %19
%143 = fcmp ole double %141, %142
br i1 %143, label %144, label %147
144: ; preds = %140
%145 = load i32, i32* %20
store i32 %145, i32* %17
%146 = load double, double* %22
store double %146, double* %19
br label %147
147: ; preds = %144, %140
br label %148
148: ; preds = %147, %139
%149 = load i32, i32* %16
%150 = load i32, i32* %17
%151 = sub nsw i32 %149, %150
%152 = sitofp i32 %151 to double
%153 = load double, double* %14
%154 = fmul double %152, %153
%155 = load double*, double** %12
%156 = getelementptr inbounds double, double* %155, i32 1
store double* %156, double** %12
store double %154, double* %155
br label %157
157: ; preds = %148
%158 = load i32, i32* %20
%159 = add nsw i32 %158, 1
store i32 %159, i32* %20
%160 = load i32, i32* %15
%161 = add nsw i32 %160, 1
store i32 %161, i32* %15
br label %56
162: ; preds = %56
%163 = load double*, double** %12
%164 = load double**, double*** %9
%165 = getelementptr inbounds double*, double** %164, i64 0
%166 = load double*, double** %165
%167 = ptrtoint double* %163 to i64
%168 = ptrtoint double* %166 to i64
%169 = sub i64 %167, %168
%170 = sdiv exact i64 %169, 8
%171 = load i32, i32* %6
%172 = load double*, double** %8
%173 = call i32 @ti_aroonosc_start(double* %172)
%174 = sub nsw i32 %171, %173
%175 = sext i32 %174 to i64
%176 = icmp eq i64 %170, %175
%177 = zext i1 %176 to i32
%178 = call i32 @assert(i32 %177)
store i32 0, i32* %5
br label %179
179: ; preds = %162, %44, %38
%180 = load i32, i32* %5
ret i32 %180
}

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