#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_psar_start(double const *);
int ti_psar(int size, double const *const *inputs, double const *options,
            double *const *outputs) {
  const double *high = inputs[0];
  const double *low = inputs[1];
  const double accel_step = options[0];
  const double accel_max = options[1];
  double *output = outputs[0];
  if (accel_step <= 0)
    return 1;
  if (accel_max <= accel_step)
    return 1;
  if (size < 2)
    return 0;
  int lng;
  if (high[0] + low[0] <= high[1] + low[1])
    lng = 1;
  else
    lng = 0;
  double sar, extreme;
  if (lng) {
    extreme = high[0];
    sar = low[0];
  } else {
    extreme = low[0];
    sar = high[0];
  }
  double accel = accel_step;
  int i;
  for (i = 1; i < size; ++i) {
    sar = (extreme - sar) * accel + sar;
    if (lng) {
      if (i >= 2 && (sar > low[i - 2]))
        sar = low[i - 2];
      if ((sar > low[i - 1]))
        sar = low[i - 1];
      if (accel < accel_max && high[i] > extreme) {
        accel += accel_step;
        if (accel > accel_max)
          accel = accel_max;
      }
      if (high[i] > extreme)
        extreme = high[i];
    } else {
      if (i >= 2 && (sar < high[i - 2]))
        sar = high[i - 2];
      if ((sar < high[i - 1]))
        sar = high[i - 1];
      if (accel < accel_max && low[i] < extreme) {
        accel += accel_step;
        if (accel > accel_max)
          accel = accel_max;
      }
      if (low[i] < extreme)
        extreme = low[i];
    }
    if ((lng && low[i] < sar) || (!lng && high[i] > sar)) {
      accel = accel_step;
      sar = extreme;
      lng = !lng;
      if (!lng)
        extreme = low[i];
      else
        extreme = high[i];
    }
    *output++ = sar;
  }
  assert(output - outputs[0] == size - ti_psar_start(options));
  return 0;
}


x86 assembly (clang, -O0):
<ti_psar>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%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    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x48(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x38(%rbp),%xmm0
jb     1191 <ti_psar+0x71>
movl   $0x1,-0x4(%rbp)
jmp    15ac <ti_psar+0x48c>
movsd  -0x40(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     11b1 <ti_psar+0x91>
movl   $0x1,-0x4(%rbp)
jmp    15ac <ti_psar+0x48c>
cmpl   $0x2,-0x8(%rbp)
jge    11c7 <ti_psar+0xa7>
movl   $0x0,-0x4(%rbp)
jmp    15ac <ti_psar+0x48c>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm1
mov    -0x30(%rbp),%rax
addsd  (%rax),%xmm1
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x30(%rbp),%rax
addsd  0x8(%rax),%xmm0
ucomisd %xmm1,%xmm0
jb     11ff <ti_psar+0xdf>
movl   $0x1,-0x4c(%rbp)
jmp    1206 <ti_psar+0xe6>
movl   $0x0,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
je     122f <ti_psar+0x10f>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    1249 <ti_psar+0x129>
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movl   $0x1,-0x6c(%rbp)
mov    -0x6c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1562 <ti_psar+0x442>
movsd  -0x60(%rbp),%xmm0
subsd  -0x58(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
cmpl   $0x0,-0x4c(%rbp)
je     138c <ti_psar+0x26c>
cmpl   $0x2,-0x6c(%rbp)
jl     12cf <ti_psar+0x1af>
movsd  -0x58(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    12cf <ti_psar+0x1af>
mov    -0x30(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
mov    -0x30(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
ucomisd (%rax,%rcx,8),%xmm0
jbe    1303 <ti_psar+0x1e3>
mov    -0x30(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x68(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    135d <ti_psar+0x23d>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x60(%rbp),%xmm0
jbe    135d <ti_psar+0x23d>
movsd  -0x38(%rbp),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    1358 <ti_psar+0x238>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    135d <ti_psar+0x23d>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x60(%rbp),%xmm0
jbe    1387 <ti_psar+0x267>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1497 <ti_psar+0x377>
cmpl   $0x2,-0x6c(%rbp)
jl     13ce <ti_psar+0x2ae>
movsd  -0x58(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    13ce <ti_psar+0x2ae>
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm1
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    1406 <ti_psar+0x2e6>
mov    -0x28(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x68(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1464 <ti_psar+0x344>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x60(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1464 <ti_psar+0x344>
movsd  -0x38(%rbp),%xmm0
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    145f <ti_psar+0x33f>
movsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    1464 <ti_psar+0x344>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x60(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1492 <ti_psar+0x372>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1497 <ti_psar+0x377>
cmpl   $0x0,-0x4c(%rbp)
je     14bd <ti_psar+0x39d>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x58(%rbp),%xmm0
ucomisd %xmm1,%xmm0
ja     14df <ti_psar+0x3bf>
cmpl   $0x0,-0x4c(%rbp)
jne    153c <ti_psar+0x41c>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x58(%rbp),%xmm0
jbe    153c <ti_psar+0x41c>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
cmpl   $0x0,-0x4c(%rbp)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4c(%rbp)
cmpl   $0x0,-0x4c(%rbp)
jne    1525 <ti_psar+0x405>
mov    -0x30(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1537 <ti_psar+0x417>
mov    -0x28(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    153c <ti_psar+0x41c>
movsd  -0x58(%rbp),%xmm0
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x48(%rbp)
movsd  %xmm0,(%rax)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    125a <ti_psar+0x13a>
mov    -0x48(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
sub    %rcx,%rax
sar    $0x3,%rax
mov    %rax,-0x78(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x18(%rbp),%rdi
call   1030 <ti_psar_start@plt>
mov    -0x7c(%rbp),%ecx
mov    %eax,%edx
mov    -0x78(%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    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ti_psar>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
movsd  (%rdx),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
mov    $0x1,%r14d
jae    1290 <ti_psar+0x170>
movsd  0x8(%rdx),%xmm1
ucomisd %xmm1,%xmm0
jae    1290 <ti_psar+0x170>
mov    %edi,%r15d
xor    %r14d,%r14d
cmp    $0x2,%edi
jl     1290 <ti_psar+0x170>
mov    (%rsi),%rax
mov    0x8(%rsi),%rsi
movupd (%rax),%xmm7
movupd (%rsi),%xmm6
movapd %xmm7,%xmm5
addpd  %xmm6,%xmm5
movapd %xmm5,%xmm2
unpckhpd %xmm5,%xmm2
ucomisd %xmm5,%xmm2
cmpnlesd %xmm2,%xmm5
movapd %xmm5,%xmm2
andpd  %xmm6,%xmm2
andnpd %xmm7,%xmm5
orpd   %xmm2,%xmm5
movapd %xmm7,%xmm3
jb     119f <ti_psar+0x7f>
movapd %xmm6,%xmm3
mov    (%rcx),%r8
movapd %xmm5,%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm0,%xmm2
addsd  %xmm3,%xmm2
jae    1205 <ti_psar+0xe5>
movapd %xmm7,%xmm4
maxsd  %xmm2,%xmm4
ucomisd %xmm0,%xmm1
unpckhpd %xmm6,%xmm6
movapd %xmm6,%xmm3
movapd %xmm0,%xmm2
jbe    11ea <ti_psar+0xca>
ucomisd %xmm3,%xmm5
movapd %xmm0,%xmm2
jbe    11ea <ti_psar+0xca>
movapd %xmm0,%xmm2
addsd  %xmm0,%xmm2
ucomisd %xmm1,%xmm2
jbe    11ea <ti_psar+0xca>
movapd %xmm1,%xmm2
minsd  %xmm5,%xmm3
unpckhpd %xmm7,%xmm7
ucomisd %xmm4,%xmm7
jbe    125c <ti_psar+0x13c>
mov    $0x1,%bpl
movapd %xmm3,%xmm4
movapd %xmm7,%xmm3
jmp    1256 <ti_psar+0x136>
movapd %xmm6,%xmm4
minsd  %xmm2,%xmm4
ucomisd %xmm0,%xmm1
unpckhpd %xmm7,%xmm7
movapd %xmm7,%xmm3
movapd %xmm0,%xmm2
jbe    123b <ti_psar+0x11b>
ucomisd %xmm5,%xmm3
movapd %xmm0,%xmm2
jbe    123b <ti_psar+0x11b>
movapd %xmm0,%xmm2
addsd  %xmm0,%xmm2
ucomisd %xmm1,%xmm2
jbe    123b <ti_psar+0x11b>
movapd %xmm1,%xmm2
maxsd  %xmm5,%xmm3
unpckhpd %xmm6,%xmm6
mov    $0x1,%bpl
ucomisd %xmm6,%xmm4
jbe    125e <ti_psar+0x13e>
xor    %ebp,%ebp
movapd %xmm3,%xmm4
movapd %xmm6,%xmm3
movapd %xmm0,%xmm2
jmp    125e <ti_psar+0x13e>
xor    %ebp,%ebp
lea    0x8(%r8),%rbx
movsd  %xmm4,(%r8)
cmp    $0x2,%r15d
jne    129e <ti_psar+0x17e>
sub    %r8,%rbx
sar    $0x3,%rbx
mov    %rdx,%rdi
call   1030 <ti_psar_start@plt>
sub    %eax,%r15d
movslq %r15d,%rax
xor    %edi,%edi
cmp    %rax,%rbx
sete   %dil
call   1040 <assert@plt>
mov    %r14d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r15d,%r9d
add    $0xfffffffffffffffe,%r9
xor    %ecx,%ecx
jmp    12d4 <ti_psar+0x1b4>
nopl   0x0(%rax)
mov    $0x1,%bpl
movapd %xmm5,%xmm4
movapd %xmm3,%xmm5
movapd %xmm0,%xmm2
movsd  %xmm4,(%rbx)
add    $0x8,%rbx
add    $0x1,%rcx
movapd %xmm5,%xmm3
cmp    %rcx,%r9
je     126d <ti_psar+0x14d>
movapd %xmm3,%xmm6
subsd  %xmm4,%xmm6
mulsd  %xmm2,%xmm6
addsd  %xmm4,%xmm6
mov    %ecx,%edi
test   $0x1,%bpl
je     1340 <ti_psar+0x220>
ucomisd %xmm2,%xmm1
movsd  0x10(%rax,%rcx,8),%xmm7
jbe    130c <ti_psar+0x1ec>
ucomisd %xmm3,%xmm7
jbe    130c <ti_psar+0x1ec>
addsd  %xmm0,%xmm2
ucomisd %xmm1,%xmm2
jbe    130c <ti_psar+0x1ec>
movapd %xmm1,%xmm2
movsd  (%rsi,%rdi,8),%xmm5
minsd  %xmm6,%xmm5
movsd  0x8(%rsi,%rcx,8),%xmm4
minsd  %xmm5,%xmm4
maxsd  %xmm3,%xmm7
movsd  0x10(%rsi,%rcx,8),%xmm5
mov    $0x1,%bpl
ucomisd %xmm5,%xmm4
jbe    1390 <ti_psar+0x270>
xor    %ebp,%ebp
movapd %xmm7,%xmm4
jmp    12bb <ti_psar+0x19b>
nopw   0x0(%rax,%rax,1)
ucomisd %xmm2,%xmm1
movsd  0x10(%rsi,%rcx,8),%xmm5
jbe    1360 <ti_psar+0x240>
ucomisd %xmm5,%xmm3
jbe    1360 <ti_psar+0x240>
addsd  %xmm0,%xmm2
ucomisd %xmm1,%xmm2
jbe    1360 <ti_psar+0x240>
movapd %xmm1,%xmm2
movsd  (%rax,%rdi,8),%xmm7
maxsd  %xmm6,%xmm7
movsd  0x8(%rax,%rcx,8),%xmm4
maxsd  %xmm7,%xmm4
minsd  %xmm3,%xmm5
movsd  0x10(%rax,%rcx,8),%xmm3
ucomisd %xmm4,%xmm3
ja     12b0 <ti_psar+0x190>
xor    %ebp,%ebp
jmp    12bf <ti_psar+0x19f>
xchg   %ax,%ax
movapd %xmm7,%xmm5
jmp    12bf <ti_psar+0x19f>

LLVM IR (-O0):
define i32 @ti_psar(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 double
%14 = alloca double*
%15 = alloca i32
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca i32
store i32 %0, i32* %6
store double** %1, double*** %7
store double* %2, double** %8
store double** %3, double*** %9
%20 = load double**, double*** %7
%21 = getelementptr inbounds double*, double** %20, i64 0
%22 = load double*, double** %21
store double* %22, double** %10
%23 = load double**, double*** %7
%24 = getelementptr inbounds double*, double** %23, i64 1
%25 = load double*, double** %24
store double* %25, double** %11
%26 = load double*, double** %8
%27 = getelementptr inbounds double, double* %26, i64 0
%28 = load double, double* %27
store double %28, double* %12
%29 = load double*, double** %8
%30 = getelementptr inbounds double, double* %29, i64 1
%31 = load double, double* %30
store double %31, double* %13
%32 = load double**, double*** %9
%33 = getelementptr inbounds double*, double** %32, i64 0
%34 = load double*, double** %33
store double* %34, double** %14
%35 = load double, double* %12
%36 = fcmp ole double %35, 0.000000e+00
br i1 %36, label %37, label %38
37: ; preds = %4
store i32 1, i32* %5
br label %309
38: ; preds = %4
%39 = load double, double* %13
%40 = load double, double* %12
%41 = fcmp ole double %39, %40
br i1 %41, label %42, label %43
42: ; preds = %38
store i32 1, i32* %5
br label %309
43: ; preds = %38
%44 = load i32, i32* %6
%45 = icmp slt i32 %44, 2
br i1 %45, label %46, label %47
46: ; preds = %43
store i32 0, i32* %5
br label %309
47: ; preds = %43
%48 = load double*, double** %10
%49 = getelementptr inbounds double, double* %48, i64 0
%50 = load double, double* %49
%51 = load double*, double** %11
%52 = getelementptr inbounds double, double* %51, i64 0
%53 = load double, double* %52
%54 = fadd double %50, %53
%55 = load double*, double** %10
%56 = getelementptr inbounds double, double* %55, i64 1
%57 = load double, double* %56
%58 = load double*, double** %11
%59 = getelementptr inbounds double, double* %58, i64 1
%60 = load double, double* %59
%61 = fadd double %57, %60
%62 = fcmp ole double %54, %61
br i1 %62, label %63, label %64
63: ; preds = %47
store i32 1, i32* %15
br label %65
64: ; preds = %47
store i32 0, i32* %15
br label %65
65: ; preds = %64, %63
%66 = load i32, i32* %15
%67 = icmp ne i32 %66, 0
br i1 %67, label %68, label %75
68: ; preds = %65
%69 = load double*, double** %10
%70 = getelementptr inbounds double, double* %69, i64 0
%71 = load double, double* %70
store double %71, double* %17
%72 = load double*, double** %11
%73 = getelementptr inbounds double, double* %72, i64 0
%74 = load double, double* %73
store double %74, double* %16
br label %82
75: ; preds = %65
%76 = load double*, double** %11
%77 = getelementptr inbounds double, double* %76, i64 0
%78 = load double, double* %77
store double %78, double* %17
%79 = load double*, double** %10
%80 = getelementptr inbounds double, double* %79, i64 0
%81 = load double, double* %80
store double %81, double* %16
br label %82
82: ; preds = %75, %68
%83 = load double, double* %12
store double %83, double* %18
store i32 1, i32* %19
br label %84
84: ; preds = %289, %82
%85 = load i32, i32* %19
%86 = load i32, i32* %6
%87 = icmp slt i32 %85, %86
br i1 %87, label %88, label %292
88: ; preds = %84
%89 = load double, double* %17
%90 = load double, double* %16
%91 = fsub double %89, %90
%92 = load double, double* %18
%93 = load double, double* %16
%94 = call double @llvm.fmuladd.f64(double %91, double %92, double %93)
store double %94, double* %16
%95 = load i32, i32* %15
%96 = icmp ne i32 %95, 0
br i1 %96, label %97, label %169
97: ; preds = %88
%98 = load i32, i32* %19
%99 = icmp sge i32 %98, 2
br i1 %99, label %100, label %116
100: ; preds = %97
%101 = load double, double* %16
%102 = load double*, double** %11
%103 = load i32, i32* %19
%104 = sub nsw i32 %103, 2
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds double, double* %102, i64 %105
%107 = load double, double* %106
%108 = fcmp ogt double %101, %107
br i1 %108, label %109, label %116
109: ; preds = %100
%110 = load double*, double** %11
%111 = load i32, i32* %19
%112 = sub nsw i32 %111, 2
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds double, double* %110, i64 %113
%115 = load double, double* %114
store double %115, double* %16
br label %116
116: ; preds = %109, %100, %97
%117 = load double, double* %16
%118 = load double*, double** %11
%119 = load i32, i32* %19
%120 = sub nsw i32 %119, 1
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds double, double* %118, i64 %121
%123 = load double, double* %122
%124 = fcmp ogt double %117, %123
br i1 %124, label %125, label %132
125: ; preds = %116
%126 = load double*, double** %11
%127 = load i32, i32* %19
%128 = sub nsw i32 %127, 1
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds double, double* %126, i64 %129
%131 = load double, double* %130
store double %131, double* %16
br label %132
132: ; preds = %125, %116
%133 = load double, double* %18
%134 = load double, double* %13
%135 = fcmp olt double %133, %134
br i1 %135, label %136, label %154
136: ; preds = %132
%137 = load double*, double** %10
%138 = load i32, i32* %19
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds double, double* %137, i64 %139
%141 = load double, double* %140
%142 = load double, double* %17
%143 = fcmp ogt double %141, %142
br i1 %143, label %144, label %154
144: ; preds = %136
%145 = load double, double* %12
%146 = load double, double* %18
%147 = fadd double %146, %145
store double %147, double* %18
%148 = load double, double* %18
%149 = load double, double* %13
%150 = fcmp ogt double %148, %149
br i1 %150, label %151, label %153
151: ; preds = %144
%152 = load double, double* %13
store double %152, double* %18
br label %153
153: ; preds = %151, %144
br label %154
154: ; preds = %153, %136, %132
%155 = load double*, double** %10
%156 = load i32, i32* %19
%157 = sext i32 %156 to i64
%158 = getelementptr inbounds double, double* %155, i64 %157
%159 = load double, double* %158
%160 = load double, double* %17
%161 = fcmp ogt double %159, %160
br i1 %161, label %162, label %168
162: ; preds = %154
%163 = load double*, double** %10
%164 = load i32, i32* %19
%165 = sext i32 %164 to i64
%166 = getelementptr inbounds double, double* %163, i64 %165
%167 = load double, double* %166
store double %167, double* %17
br label %168
168: ; preds = %162, %154
br label %241
169: ; preds = %88
%170 = load i32, i32* %19
%171 = icmp sge i32 %170, 2
br i1 %171, label %172, label %188
172: ; preds = %169
%173 = load double, double* %16
%174 = load double*, double** %10
%175 = load i32, i32* %19
%176 = sub nsw i32 %175, 2
%177 = sext i32 %176 to i64
%178 = getelementptr inbounds double, double* %174, i64 %177
%179 = load double, double* %178
%180 = fcmp olt double %173, %179
br i1 %180, label %181, label %188
181: ; preds = %172
%182 = load double*, double** %10
%183 = load i32, i32* %19
%184 = sub nsw i32 %183, 2
%185 = sext i32 %184 to i64
%186 = getelementptr inbounds double, double* %182, i64 %185
%187 = load double, double* %186
store double %187, double* %16
br label %188
188: ; preds = %181, %172, %169
%189 = load double, double* %16
%190 = load double*, double** %10
%191 = load i32, i32* %19
%192 = sub nsw i32 %191, 1
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds double, double* %190, i64 %193
%195 = load double, double* %194
%196 = fcmp olt double %189, %195
br i1 %196, label %197, label %204
197: ; preds = %188
%198 = load double*, double** %10
%199 = load i32, i32* %19
%200 = sub nsw i32 %199, 1
%201 = sext i32 %200 to i64
%202 = getelementptr inbounds double, double* %198, i64 %201
%203 = load double, double* %202
store double %203, double* %16
br label %204
204: ; preds = %197, %188
%205 = load double, double* %18
%206 = load double, double* %13
%207 = fcmp olt double %205, %206
br i1 %207, label %208, label %226
208: ; preds = %204
%209 = load double*, double** %11
%210 = load i32, i32* %19
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds double, double* %209, i64 %211
%213 = load double, double* %212
%214 = load double, double* %17
%215 = fcmp olt double %213, %214
br i1 %215, label %216, label %226
216: ; preds = %208
%217 = load double, double* %12
%218 = load double, double* %18
%219 = fadd double %218, %217
store double %219, double* %18
%220 = load double, double* %18
%221 = load double, double* %13
%222 = fcmp ogt double %220, %221
br i1 %222, label %223, label %225
223: ; preds = %216
%224 = load double, double* %13
store double %224, double* %18
br label %225
225: ; preds = %223, %216
br label %226
226: ; preds = %225, %208, %204
%227 = load double*, double** %11
%228 = load i32, i32* %19
%229 = sext i32 %228 to i64
%230 = getelementptr inbounds double, double* %227, i64 %229
%231 = load double, double* %230
%232 = load double, double* %17
%233 = fcmp olt double %231, %232
br i1 %233, label %234, label %240
234: ; preds = %226
%235 = load double*, double** %11
%236 = load i32, i32* %19
%237 = sext i32 %236 to i64
%238 = getelementptr inbounds double, double* %235, i64 %237
%239 = load double, double* %238
store double %239, double* %17
br label %240
240: ; preds = %234, %226
br label %241
241: ; preds = %240, %168
%242 = load i32, i32* %15
%243 = icmp ne i32 %242, 0
br i1 %243, label %244, label %252
244: ; preds = %241
%245 = load double*, double** %11
%246 = load i32, i32* %19
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds double, double* %245, i64 %247
%249 = load double, double* %248
%250 = load double, double* %16
%251 = fcmp olt double %249, %250
br i1 %251, label %263, label %252
252: ; preds = %244, %241
%253 = load i32, i32* %15
%254 = icmp ne i32 %253, 0
br i1 %254, label %285, label %255
255: ; preds = %252
%256 = load double*, double** %10
%257 = load i32, i32* %19
%258 = sext i32 %257 to i64
%259 = getelementptr inbounds double, double* %256, i64 %258
%260 = load double, double* %259
%261 = load double, double* %16
%262 = fcmp ogt double %260, %261
br i1 %262, label %263, label %285
263: ; preds = %255, %244
%264 = load double, double* %12
store double %264, double* %18
%265 = load double, double* %17
store double %265, double* %16
%266 = load i32, i32* %15
%267 = icmp ne i32 %266, 0
%268 = xor i1 %267, true
%269 = zext i1 %268 to i32
store i32 %269, i32* %15
%270 = load i32, i32* %15
%271 = icmp ne i32 %270, 0
br i1 %271, label %278, label %272
272: ; preds = %263
%273 = load double*, double** %11
%274 = load i32, i32* %19
%275 = sext i32 %274 to i64
%276 = getelementptr inbounds double, double* %273, i64 %275
%277 = load double, double* %276
store double %277, double* %17
br label %284
278: ; preds = %263
%279 = load double*, double** %10
%280 = load i32, i32* %19
%281 = sext i32 %280 to i64
%282 = getelementptr inbounds double, double* %279, i64 %281
%283 = load double, double* %282
store double %283, double* %17
br label %284
284: ; preds = %278, %272
br label %285
285: ; preds = %284, %255, %252
%286 = load double, double* %16
%287 = load double*, double** %14
%288 = getelementptr inbounds double, double* %287, i32 1
store double* %288, double** %14
store double %286, double* %287
br label %289
289: ; preds = %285
%290 = load i32, i32* %19
%291 = add nsw i32 %290, 1
store i32 %291, i32* %19
br label %84
292: ; preds = %84
%293 = load double*, double** %14
%294 = load double**, double*** %9
%295 = getelementptr inbounds double*, double** %294, i64 0
%296 = load double*, double** %295
%297 = ptrtoint double* %293 to i64
%298 = ptrtoint double* %296 to i64
%299 = sub i64 %297, %298
%300 = sdiv exact i64 %299, 8
%301 = load i32, i32* %6
%302 = load double*, double** %8
%303 = call i32 @ti_psar_start(double* %302)
%304 = sub nsw i32 %301, %303
%305 = sext i32 %304 to i64
%306 = icmp eq i64 %300, %305
%307 = zext i1 %306 to i32
%308 = call i32 @assert(i32 %307)
store i32 0, i32* %5
br label %309
309: ; preds = %292, %46, %42, %37
%310 = load i32, i32* %5
ret i32 %310
}

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