#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 */
typedef scalar_t__ uint;

/* Variables and functions */
int /*<<< orphan*/ DC(double, double *, scalar_t__ *, scalar_t__, double,
                      double, double);
double fabs(double);
double pow(double, double);
void RAMP(double y_final, double *output, uint *index, uint Ni, double expon,
          double srate, double dt) {
  uint i;
  double tmp1, tmp2;
  tmp1 = ((*index) == 0) ? 0. : output[(*index) - 1];
  if (y_final == tmp1) {
    DC(tmp1, output, index, Ni, expon, srate, dt);
    return;
  }
  tmp2 = (y_final - tmp1) / Ni;
  if (expon == -1)
    for (i = 0; i < Ni; i++)
      output[(*index)++] = fabs(tmp1 + tmp2 * i);
  else if (expon == 0)
    for (i = 0; i < Ni; i++)
      output[(*index)++] = (((tmp1 + tmp2 * i) > 0) ? tmp1 + tmp2 * i : 0.);
  else if (expon != 1)
    for (i = 0; i < Ni; i++)
      output[(*index)++] = pow(tmp1 + tmp2 * i, expon);
  else
    for (i = 0; i < Ni; i++)
      output[(*index)++] = tmp1 + tmp2 * i;
  return;
}


x86 assembly (clang, -O0):
<RAMP>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movsd  %xmm0,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movsd  %xmm1,-0x28(%rbp)
movsd  %xmm2,-0x30(%rbp)
movsd  %xmm3,-0x38(%rbp)
mov    -0x18(%rbp),%rax
cmpq   $0x0,(%rax)
jne    1163 <RAMP+0x43>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    117c <RAMP+0x5c>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    (%rcx),%rcx
sub    $0x1,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x8(%rbp),%xmm0
ucomisd -0x48(%rbp),%xmm0
jne    11c6 <RAMP+0xa6>
jp     11c6 <RAMP+0xa6>
movsd  -0x48(%rbp),%xmm0
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x20(%rbp),%rdx
movsd  -0x28(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm2
movsd  -0x38(%rbp),%xmm3
call   1030 <DC@plt>
jmp    1413 <RAMP+0x2f3>
movsd  -0x8(%rbp),%xmm0
subsd  -0x48(%rbp),%xmm0
cvtsi2sdq -0x20(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  0xe14(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1265 <RAMP+0x145>
jp     1265 <RAMP+0x145>
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    1260 <RAMP+0x140>
movsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
cvtsi2sdq -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movaps 0xddf(%rip),%xmm1
pand   %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rdx
mov    (%rdx),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,(%rdx)
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1204 <RAMP+0xe4>
jmp    140e <RAMP+0x2ee>
movsd  -0x28(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    131c <RAMP+0x1fc>
jp     131c <RAMP+0x1fc>
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    1317 <RAMP+0x1f7>
movsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
cvtsi2sdq -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    12da <RAMP+0x1ba>
movsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
cvtsi2sdq -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    12e7 <RAMP+0x1c7>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    12e7 <RAMP+0x1c7>
movsd  -0x60(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rdx
mov    (%rdx),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,(%rdx)
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1285 <RAMP+0x165>
jmp    1409 <RAMP+0x2e9>
movsd  -0x28(%rbp),%xmm0
movsd  0xcdf(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    133e <RAMP+0x21e>
jp     133e <RAMP+0x21e>
jmp    13a6 <RAMP+0x286>
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    13a1 <RAMP+0x281>
movsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
cvtsi2sdq -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm1
call   1040 <pow@plt>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rdx
mov    (%rdx),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,(%rdx)
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1346 <RAMP+0x226>
jmp    1404 <RAMP+0x2e4>
movq   $0x0,-0x40(%rbp)
mov    -0x40(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    13ff <RAMP+0x2df>
movsd  -0x48(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
cvtsi2sdq -0x40(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rdx
mov    (%rdx),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,(%rdx)
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    13ae <RAMP+0x28e>
jmp    1404 <RAMP+0x2e4>
jmp    1409 <RAMP+0x2e9>
jmp    140e <RAMP+0x2ee>
jmp    1413 <RAMP+0x2f3>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<RAMP>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x30,%rsp
mov    %rdx,%r15
mov    %rsi,%r14
mov    %rdi,%r13
movapd %xmm0,%xmm5
mov    (%rsi),%rax
test   %rax,%rax
je     114b <RAMP+0x2b>
movsd  -0x8(%r13,%rax,8),%xmm11
jmp    1150 <RAMP+0x30>
xorpd  %xmm11,%xmm11
ucomisd %xmm5,%xmm11
jne    1179 <RAMP+0x59>
jp     1179 <RAMP+0x59>
movapd %xmm11,%xmm0
mov    %r13,%rdi
mov    %r14,%rsi
mov    %r15,%rdx
add    $0x30,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
jmp    1030 <DC@plt>
subsd  %xmm11,%xmm5
xorps  %xmm0,%xmm0
cvtsi2sd %r15,%xmm0
divsd  %xmm0,%xmm5
ucomisd 0xe6e(%rip),%xmm1
jne    11ac <RAMP+0x8c>
jp     11ac <RAMP+0x8c>
test   %r15,%r15
jle    158c <RAMP+0x46c>
cmp    $0x4,%r15
jae    11da <RAMP+0xba>
xor    %ecx,%ecx
jmp    12b9 <RAMP+0x199>
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
jne    12fe <RAMP+0x1de>
jp     12fe <RAMP+0x1de>
test   %r15,%r15
jle    158c <RAMP+0x46c>
cmp    $0x1,%r15
jne    1407 <RAMP+0x2e7>
xor    %ecx,%ecx
jmp    1559 <RAMP+0x439>
mov    %r15,%rcx
and    $0xfffffffffffffffc,%rcx
movapd %xmm5,%xmm0
unpcklpd %xmm5,%xmm0
movapd %xmm11,%xmm1
unpcklpd %xmm11,%xmm1
lea    0x10(,%rax,8),%rdx
add    %r13,%rdx
add    %rcx,%rax
movdqa 0xe07(%rip),%xmm2
xor    %esi,%esi
movdqa 0xe0c(%rip),%xmm8
movapd 0xe44(%rip),%xmm4
movdqa 0xe0b(%rip),%xmm9
cs nopw 0x0(%rax,%rax,1)
nop
movdqa %xmm2,%xmm6
paddq  %xmm8,%xmm6
movq   %xmm2,%rdi
xorps  %xmm7,%xmm7
cvtsi2sd %rdi,%xmm7
pshufd $0xee,%xmm2,%xmm3
movq   %xmm3,%rdi
xorps  %xmm3,%xmm3
cvtsi2sd %rdi,%xmm3
unpcklpd %xmm3,%xmm7
movq   %xmm6,%rdi
xorps  %xmm3,%xmm3
cvtsi2sd %rdi,%xmm3
pshufd $0xee,%xmm6,%xmm6
movq   %xmm6,%rdi
xorps  %xmm6,%xmm6
cvtsi2sd %rdi,%xmm6
unpcklpd %xmm6,%xmm3
mulpd  %xmm0,%xmm7
addpd  %xmm1,%xmm7
mulpd  %xmm0,%xmm3
addpd  %xmm1,%xmm3
andpd  %xmm4,%xmm7
andpd  %xmm4,%xmm3
movupd %xmm7,-0x10(%rdx,%rsi,8)
movupd %xmm3,(%rdx,%rsi,8)
add    $0x4,%rsi
paddq  %xmm9,%xmm2
cmp    %rsi,%rcx
jne    1230 <RAMP+0x110>
cmp    %r15,%rcx
je     1589 <RAMP+0x469>
movapd 0xd9f(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorps  %xmm1,%xmm1
cvtsi2sd %rcx,%xmm1
mulsd  %xmm5,%xmm1
addsd  %xmm11,%xmm1
andpd  %xmm0,%xmm1
movlpd %xmm1,0x0(%r13,%rax,8)
add    $0x1,%rax
add    $0x1,%rcx
cmp    %rcx,%r15
jne    12d0 <RAMP+0x1b0>
jmp    1589 <RAMP+0x469>
ucomisd 0xd02(%rip),%xmm1
jne    130e <RAMP+0x1ee>
jnp    1515 <RAMP+0x3f5>
test   %r15,%r15
jle    158c <RAMP+0x46c>
xorpd  %xmm0,%xmm0
cmp    $0x1,%r15
je     13d5 <RAMP+0x2b5>
mov    %r15,%r12
and    $0xfffffffffffffffe,%r12
xor    %ebx,%ebx
movapd %xmm5,0x20(%rsp)
movapd %xmm11,0x10(%rsp)
movsd  %xmm1,0x8(%rsp)
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xorps  %xmm0,%xmm0
cvtsi2sd %rbx,%xmm0
mulsd  %xmm5,%xmm0
addsd  %xmm11,%xmm0
movsd  0x8(%rsp),%xmm1
call   1040 <pow@plt>
mov    (%r14),%rax
lea    0x1(%rax),%rcx
mov    %rcx,(%r14)
movsd  %xmm0,0x0(%r13,%rax,8)
lea    0x1(%rbx),%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mulsd  0x20(%rsp),%xmm0
addsd  0x10(%rsp),%xmm0
movsd  0x8(%rsp),%xmm1
call   1040 <pow@plt>
movsd  0x8(%rsp),%xmm1
movapd 0x10(%rsp),%xmm11
movapd 0x20(%rsp),%xmm5
mov    (%r14),%rax
lea    0x1(%rax),%rcx
mov    %rcx,(%r14)
movsd  %xmm0,0x0(%r13,%rax,8)
add    $0x2,%rbx
cmp    %r12,%rbx
jne    1350 <RAMP+0x230>
xorps  %xmm0,%xmm0
cvtsi2sd %rbx,%xmm0
test   $0x1,%r15b
je     158c <RAMP+0x46c>
mulsd  %xmm0,%xmm5
addsd  %xmm11,%xmm5
movapd %xmm5,%xmm0
call   1040 <pow@plt>
mov    (%r14),%rax
lea    0x1(%rax),%rcx
mov    %rcx,(%r14)
movsd  %xmm0,0x0(%r13,%rax,8)
jmp    158c <RAMP+0x46c>
mov    %r15,%rcx
and    $0xfffffffffffffffe,%rcx
movapd %xmm5,%xmm0
unpcklpd %xmm5,%xmm0
movapd %xmm11,%xmm1
unpcklpd %xmm11,%xmm1
lea    -0x2(%rcx),%rdx
mov    %rdx,%r8
shr    %r8
add    $0x1,%r8
xorpd  %xmm2,%xmm2
test   %rdx,%rdx
je     1527 <RAMP+0x407>
mov    %r8,%rdi
and    $0xfffffffffffffffe,%rdi
lea    0x10(,%rax,8),%rdx
add    %r13,%rdx
movdqa 0xbbb(%rip),%xmm3
xor    %esi,%esi
movdqa 0xbc0(%rip),%xmm8
movdqa 0xbc8(%rip),%xmm4
nopl   0x0(%rax,%rax,1)
movq   %xmm3,%rbx
xorps  %xmm6,%xmm6
cvtsi2sd %rbx,%xmm6
pshufd $0xee,%xmm3,%xmm7
movq   %xmm7,%rbx
xorps  %xmm7,%xmm7
cvtsi2sd %rbx,%xmm7
unpcklpd %xmm7,%xmm6
mulpd  %xmm0,%xmm6
addpd  %xmm1,%xmm6
maxpd  %xmm2,%xmm6
movupd %xmm6,-0x10(%rdx,%rsi,8)
movdqa %xmm3,%xmm6
paddq  %xmm8,%xmm6
movq   %xmm6,%rbx
xorps  %xmm7,%xmm7
cvtsi2sd %rbx,%xmm7
pshufd $0xee,%xmm6,%xmm6
movq   %xmm6,%rbx
xorps  %xmm6,%xmm6
cvtsi2sd %rbx,%xmm6
unpcklpd %xmm6,%xmm7
mulpd  %xmm0,%xmm7
addpd  %xmm1,%xmm7
maxpd  %xmm2,%xmm7
movupd %xmm7,(%rdx,%rsi,8)
add    $0x4,%rsi
paddq  %xmm4,%xmm3
add    $0xfffffffffffffffe,%rdi
jne    1470 <RAMP+0x350>
movq   %xmm3,%rdx
xorps  %xmm2,%xmm2
cvtsi2sd %rdx,%xmm2
pshufd $0xee,%xmm3,%xmm3
movq   %xmm3,%rdx
xorps  %xmm3,%xmm3
cvtsi2sd %rdx,%xmm3
unpcklpd %xmm3,%xmm2
jmp    1531 <RAMP+0x411>
test   %r15,%r15
jle    158c <RAMP+0x46c>
cmp    $0x4,%r15
jae    159a <RAMP+0x47a>
xor    %ecx,%ecx
jmp    1790 <RAMP+0x670>
movhpd 0xad9(%rip),%xmm2
xor    %esi,%esi
test   $0x1,%r8b
je     1551 <RAMP+0x431>
add    %rax,%rsi
mulpd  %xmm2,%xmm0
addpd  %xmm1,%xmm0
xorpd  %xmm1,%xmm1
maxpd  %xmm1,%xmm0
movupd %xmm0,0x0(%r13,%rsi,8)
add    %rcx,%rax
cmp    %r15,%rcx
je     1589 <RAMP+0x469>
xorpd  %xmm0,%xmm0
nopl   (%rax)
xorps  %xmm1,%xmm1
cvtsi2sd %rcx,%xmm1
mulsd  %xmm5,%xmm1
addsd  %xmm11,%xmm1
maxsd  %xmm0,%xmm1
movsd  %xmm1,0x0(%r13,%rax,8)
add    $0x1,%rax
add    $0x1,%rcx
cmp    %rcx,%r15
jne    1560 <RAMP+0x440>
mov    %rax,(%r14)
add    $0x30,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret
mov    %r15,%rcx
and    $0xfffffffffffffffc,%rcx
movapd %xmm5,%xmm0
unpcklpd %xmm5,%xmm0
movapd %xmm11,%xmm1
unpcklpd %xmm11,%xmm1
lea    -0x4(%rcx),%rdx
mov    %rdx,%r8
shr    $0x2,%r8
add    $0x1,%r8
test   %rdx,%rdx
je     16fc <RAMP+0x5dc>
mov    %r8,%rdi
and    $0xfffffffffffffffe,%rdi
lea    0x30(,%rax,8),%rsi
add    %r13,%rsi
movdqa 0xa2b(%rip),%xmm2
xor    %edx,%edx
movdqa 0xa30(%rip),%xmm8
movdqa 0xa37(%rip),%xmm9
movdqa 0xa3e(%rip),%xmm10
movdqa 0xa46(%rip),%xmm6
movdqa %xmm2,%xmm7
paddq  %xmm8,%xmm7
movq   %xmm2,%rbx
xorps  %xmm3,%xmm3
cvtsi2sd %rbx,%xmm3
pshufd $0xee,%xmm2,%xmm4
movq   %xmm4,%rbx
xorps  %xmm4,%xmm4
cvtsi2sd %rbx,%xmm4
unpcklpd %xmm4,%xmm3
movq   %xmm7,%rbx
xorps  %xmm4,%xmm4
cvtsi2sd %rbx,%xmm4
pshufd $0xee,%xmm7,%xmm7
movq   %xmm7,%rbx
xorps  %xmm7,%xmm7
cvtsi2sd %rbx,%xmm7
unpcklpd %xmm7,%xmm4
mulpd  %xmm0,%xmm3
addpd  %xmm1,%xmm3
mulpd  %xmm0,%xmm4
addpd  %xmm1,%xmm4
movupd %xmm3,-0x30(%rsi,%rdx,8)
movupd %xmm4,-0x20(%rsi,%rdx,8)
movdqa %xmm2,%xmm3
paddq  %xmm9,%xmm3
movdqa %xmm2,%xmm4
paddq  %xmm10,%xmm4
movq   %xmm3,%rbx
xorps  %xmm7,%xmm7
cvtsi2sd %rbx,%xmm7
pshufd $0xee,%xmm3,%xmm3
movq   %xmm3,%rbx
xorps  %xmm3,%xmm3
cvtsi2sd %rbx,%xmm3
unpcklpd %xmm3,%xmm7
movq   %xmm4,%rbx
xorps  %xmm3,%xmm3
cvtsi2sd %rbx,%xmm3
pshufd $0xee,%xmm4,%xmm4
movq   %xmm4,%rbx
xorps  %xmm4,%xmm4
cvtsi2sd %rbx,%xmm4
unpcklpd %xmm4,%xmm3
mulpd  %xmm0,%xmm7
addpd  %xmm1,%xmm7
mulpd  %xmm0,%xmm3
addpd  %xmm1,%xmm3
movupd %xmm7,-0x10(%rsi,%rdx,8)
movupd %xmm3,(%rsi,%rdx,8)
add    $0x8,%rdx
paddq  %xmm6,%xmm2
add    $0xfffffffffffffffe,%rdi
jne    160a <RAMP+0x4ea>
jmp    1706 <RAMP+0x5e6>
movdqa 0x90c(%rip),%xmm2
xor    %edx,%edx
test   $0x1,%r8b
je     177f <RAMP+0x65f>
movdqa 0x90c(%rip),%xmm3
paddq  %xmm2,%xmm3
movq   %xmm2,%rsi
xorps  %xmm4,%xmm4
cvtsi2sd %rsi,%xmm4
pshufd $0xee,%xmm2,%xmm2
movq   %xmm2,%rsi
xorps  %xmm2,%xmm2
cvtsi2sd %rsi,%xmm2
unpcklpd %xmm2,%xmm4
movq   %xmm3,%rsi
xorps  %xmm2,%xmm2
cvtsi2sd %rsi,%xmm2
pshufd $0xee,%xmm3,%xmm3
movq   %xmm3,%rsi
xorps  %xmm3,%xmm3
cvtsi2sd %rsi,%xmm3
add    %rax,%rdx
unpcklpd %xmm3,%xmm2
mulpd  %xmm0,%xmm4
addpd  %xmm1,%xmm4
mulpd  %xmm0,%xmm2
addpd  %xmm1,%xmm2
movupd %xmm4,0x0(%r13,%rdx,8)
movupd %xmm2,0x10(%r13,%rdx,8)
add    %rcx,%rax
cmp    %r15,%rcx
je     1589 <RAMP+0x469>
nopl   0x0(%rax,%rax,1)
xorps  %xmm0,%xmm0
cvtsi2sd %rcx,%xmm0
mulsd  %xmm5,%xmm0
addsd  %xmm11,%xmm0
movsd  %xmm0,0x0(%r13,%rax,8)
add    $0x1,%rax
add    $0x1,%rcx
cmp    %rcx,%r15
jne    1790 <RAMP+0x670>
jmp    1589 <RAMP+0x469>

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

LLVM IR (-O2):
define void @RAMP(double %0, double* %1, i64* %2, i64 %3, double %4, double %5, double %6) {
%8 = load i64, i64* %2
%9 = icmp eq i64 %8, 0
br i1 %9, label %14, label %10
10: ; preds = %7
%11 = add nsw i64 %8, -1
%12 = getelementptr inbounds double, double* %1, i64 %11
%13 = load double, double* %12
br label %14
14: ; preds = %7, %10
%15 = phi double [ %13, %10 ], [ 0.000000e+00, %7 ]
%16 = fcmp oeq double %15, %0
br i1 %16, label %17, label %19
17: ; preds = %14
%18 = tail call i32 @DC(double %15, double* %1, i64* %2, i64 %3, double %4, double %5, double %6)
br label %270
19: ; preds = %14
%20 = fsub double %0, %15
%21 = sitofp i64 %3 to double
%22 = fdiv double %20, %21
%23 = fcmp oeq double %4, -1.000000e+00
br i1 %23, label %24, label %72
24: ; preds = %19
%25 = icmp sgt i64 %3, 0
br i1 %25, label %26, label %270
26: ; preds = %24
%27 = icmp ult i64 %3, 4
br i1 %27, label %59, label %28
28: ; preds = %26
%29 = and i64 %3, -4
%30 = add i64 %8, %29
%31 = insertelement <2 x double> poison, double %22, i64 0
%32 = shufflevector <2 x double> %31, <2 x double> poison, <2 x i32> zeroinitializer
%33 = insertelement <2 x double> poison, double %15, i64 0
%34 = shufflevector <2 x double> %33, <2 x double> poison, <2 x i32> zeroinitializer
%35 = insertelement <2 x double> poison, double %22, i64 0
%36 = shufflevector <2 x double> %35, <2 x double> poison, <2 x i32> zeroinitializer
%37 = insertelement <2 x double> poison, double %15, i64 0
%38 = shufflevector <2 x double> %37, <2 x double> poison, <2 x i32> zeroinitializer
br label %39
39: ; preds = %39, %28
%40 = phi i64 [ 0, %28 ], [ %54, %39 ]
%41 = phi <2 x i64> [ <i64 0, i64 1>, %28 ], [ %55, %39 ]
%42 = add i64 %8, %40
%43 = add <2 x i64> %41, <i64 2, i64 2>
%44 = sitofp <2 x i64> %41 to <2 x double>
%45 = sitofp <2 x i64> %43 to <2 x double>
%46 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %32, <2 x double> %44, <2 x double> %34)
%47 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %36, <2 x double> %45, <2 x double> %38)
%48 = call <2 x double> @llvm.fabs.v2f64(<2 x double> %46)
%49 = call <2 x double> @llvm.fabs.v2f64(<2 x double> %47)
%50 = getelementptr inbounds double, double* %1, i64 %42
%51 = bitcast double* %50 to <2 x double>*
store <2 x double> %48, <2 x double>* %51
%52 = getelementptr inbounds double, double* %50, i64 2
%53 = bitcast double* %52 to <2 x double>*
store <2 x double> %49, <2 x double>* %53
%54 = add nuw i64 %40, 4
%55 = add <2 x i64> %41, <i64 4, i64 4>
%56 = icmp eq i64 %54, %29
br i1 %56, label %57, label %39
57: ; preds = %39
%58 = icmp eq i64 %29, %3
br i1 %58, label %253, label %59
59: ; preds = %26, %57
%60 = phi i64 [ %8, %26 ], [ %30, %57 ]
%61 = phi i64 [ 0, %26 ], [ %29, %57 ]
br label %62
62: ; preds = %59, %62
%63 = phi i64 [ %68, %62 ], [ %60, %59 ]
%64 = phi i64 [ %70, %62 ], [ %61, %59 ]
%65 = sitofp i64 %64 to double
%66 = tail call double @llvm.fmuladd.f64(double %22, double %65, double %15)
%67 = tail call double @llvm.fabs.f64(double %66)
%68 = add nsw i64 %63, 1
%69 = getelementptr inbounds double, double* %1, i64 %63
store double %67, double* %69
%70 = add nuw nsw i64 %64, 1
%71 = icmp eq i64 %70, %3
br i1 %71, label %253, label %62
72: ; preds = %19
%73 = fcmp oeq double %4, 0.000000e+00
br i1 %73, label %74, label %145
74: ; preds = %72
%75 = icmp sgt i64 %3, 0
br i1 %75, label %76, label %270
76: ; preds = %74
%77 = icmp eq i64 %3, 1
br i1 %77, label %131, label %78
78: ; preds = %76
%79 = and i64 %3, -2
%80 = add i64 %8, %79
%81 = insertelement <2 x double> poison, double %22, i64 0
%82 = shufflevector <2 x double> %81, <2 x double> poison, <2 x i32> zeroinitializer
%83 = insertelement <2 x double> poison, double %15, i64 0
%84 = shufflevector <2 x double> %83, <2 x double> poison, <2 x i32> zeroinitializer
%85 = add i64 %79, -2
%86 = lshr exact i64 %85, 1
%87 = add nuw i64 %86, 1
%88 = and i64 %87, 1
%89 = icmp eq i64 %85, 0
br i1 %89, label %118, label %90
90: ; preds = %78
%91 = and i64 %87, -2
br label %92
92: ; preds = %92, %90
%93 = phi i64 [ 0, %90 ], [ %112, %92 ]
%94 = phi <2 x i64> [ <i64 0, i64 1>, %90 ], [ %113, %92 ]
%95 = phi i64 [ 0, %90 ], [ %114, %92 ]
%96 = add i64 %8, %93
%97 = sitofp <2 x i64> %94 to <2 x double>
%98 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %97, <2 x double> %84)
%99 = fcmp ogt <2 x double> %98, zeroinitializer
%100 = select <2 x i1> %99, <2 x double> %98, <2 x double> zeroinitializer
%101 = getelementptr inbounds double, double* %1, i64 %96
%102 = bitcast double* %101 to <2 x double>*
store <2 x double> %100, <2 x double>* %102
%103 = or i64 %93, 2
%104 = add <2 x i64> %94, <i64 2, i64 2>
%105 = add i64 %8, %103
%106 = sitofp <2 x i64> %104 to <2 x double>
%107 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %106, <2 x double> %84)
%108 = fcmp ogt <2 x double> %107, zeroinitializer
%109 = select <2 x i1> %108, <2 x double> %107, <2 x double> zeroinitializer
%110 = getelementptr inbounds double, double* %1, i64 %105
%111 = bitcast double* %110 to <2 x double>*
store <2 x double> %109, <2 x double>* %111
%112 = add nuw i64 %93, 4
%113 = add <2 x i64> %94, <i64 4, i64 4>
%114 = add nuw i64 %95, 2
%115 = icmp eq i64 %114, %91
br i1 %115, label %116, label %92
116: ; preds = %92
%117 = sitofp <2 x i64> %113 to <2 x double>
br label %118
118: ; preds = %116, %78
%119 = phi i64 [ 0, %78 ], [ %112, %116 ]
%120 = phi <2 x double> [ <double 0.000000e+00, double 1.000000e+00>, %78 ], [ %117, %116 ]
%121 = icmp eq i64 %88, 0
br i1 %121, label %129, label %122
122: ; preds = %118
%123 = add i64 %8, %119
%124 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %82, <2 x double> %120, <2 x double> %84)
%125 = fcmp ogt <2 x double> %124, zeroinitializer
%126 = select <2 x i1> %125, <2 x double> %124, <2 x double> zeroinitializer
%127 = getelementptr inbounds double, double* %1, i64 %123
%128 = bitcast double* %127 to <2 x double>*
store <2 x double> %126, <2 x double>* %128
br label %129
129: ; preds = %118, %122
%130 = icmp eq i64 %79, %3
br i1 %130, label %255, label %131
131: ; preds = %76, %129
%132 = phi i64 [ %8, %76 ], [ %80, %129 ]
%133 = phi i64 [ 0, %76 ], [ %79, %129 ]
br label %134
134: ; preds = %131, %134
%135 = phi i64 [ %141, %134 ], [ %132, %131 ]
%136 = phi i64 [ %143, %134 ], [ %133, %131 ]
%137 = sitofp i64 %136 to double
%138 = tail call double @llvm.fmuladd.f64(double %22, double %137, double %15)
%139 = fcmp ogt double %138, 0.000000e+00
%140 = select i1 %139, double %138, double 0.000000e+00
%141 = add nsw i64 %135, 1
%142 = getelementptr inbounds double, double* %1, i64 %135
store double %140, double* %142
%143 = add nuw nsw i64 %136, 1
%144 = icmp eq i64 %143, %3
br i1 %144, label %255, label %134
145: ; preds = %72
%146 = fcmp une double %4, 1.000000e+00
%147 = icmp sgt i64 %3, 0
br i1 %146, label %219, label %148
148: ; preds = %145
br i1 %147, label %149, label %270
149: ; preds = %148
%150 = icmp ult i64 %3, 4
br i1 %150, label %216, label %151
151: ; preds = %149
%152 = and i64 %3, -4
%153 = add i64 %8, %152
%154 = insertelement <2 x double> poison, double %22, i64 0
%155 = shufflevector <2 x double> %154, <2 x double> poison, <2 x i32> zeroinitializer
%156 = insertelement <2 x double> poison, double %15, i64 0
%157 = shufflevector <2 x double> %156, <2 x double> poison, <2 x i32> zeroinitializer
%158 = insertelement <2 x double> poison, double %22, i64 0
%159 = shufflevector <2 x double> %158, <2 x double> poison, <2 x i32> zeroinitializer
%160 = insertelement <2 x double> poison, double %15, i64 0
%161 = shufflevector <2 x double> %160, <2 x double> poison, <2 x i32> zeroinitializer
%162 = add i64 %152, -4
%163 = lshr exact i64 %162, 2
%164 = add nuw nsw i64 %163, 1
%165 = and i64 %164, 1
%166 = icmp eq i64 %162, 0
br i1 %166, label %199, label %167
167: ; preds = %151
%168 = and i64 %164, 9223372036854775806
br label %169
169: ; preds = %169, %167
%170 = phi i64 [ 0, %167 ], [ %195, %169 ]
%171 = phi <2 x i64> [ <i64 0, i64 1>, %167 ], [ %196, %169 ]
%172 = phi i64 [ 0, %167 ], [ %197, %169 ]
%173 = add i64 %8, %170
%174 = add <2 x i64> %171, <i64 2, i64 2>
%175 = sitofp <2 x i64> %171 to <2 x double>
%176 = sitofp <2 x i64> %174 to <2 x double>
%177 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %155, <2 x double> %175, <2 x double> %157)
%178 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %159, <2 x double> %176, <2 x double> %161)
%179 = getelementptr inbounds double, double* %1, i64 %173
%180 = bitcast double* %179 to <2 x double>*
store <2 x double> %177, <2 x double>* %180
%181 = getelementptr inbounds double, double* %179, i64 2
%182 = bitcast double* %181 to <2 x double>*
store <2 x double> %178, <2 x double>* %182
%183 = or i64 %170, 4
%184 = add <2 x i64> %171, <i64 4, i64 4>
%185 = add i64 %8, %183
%186 = add <2 x i64> %171, <i64 6, i64 6>
%187 = sitofp <2 x i64> %184 to <2 x double>
%188 = sitofp <2 x i64> %186 to <2 x double>
%189 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %155, <2 x double> %187, <2 x double> %157)
%190 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %159, <2 x double> %188, <2 x double> %161)
%191 = getelementptr inbounds double, double* %1, i64 %185
%192 = bitcast double* %191 to <2 x double>*
store <2 x double> %189, <2 x double>* %192
%193 = getelementptr inbounds double, double* %191, i64 2
%194 = bitcast double* %193 to <2 x double>*
store <2 x double> %190, <2 x double>* %194
%195 = add nuw i64 %170, 8
%196 = add <2 x i64> %171, <i64 8, i64 8>
%197 = add i64 %172, 2
%198 = icmp eq i64 %197, %168
br i1 %198, label %199, label %169
199: ; preds = %169, %151
%200 = phi i64 [ 0, %151 ], [ %195, %169 ]
%201 = phi <2 x i64> [ <i64 0, i64 1>, %151 ], [ %196, %169 ]
%202 = icmp eq i64 %165, 0
br i1 %202, label %214, label %203
203: ; preds = %199
%204 = add i64 %8, %200
%205 = add <2 x i64> %201, <i64 2, i64 2>
%206 = sitofp <2 x i64> %201 to <2 x double>
%207 = sitofp <2 x i64> %205 to <2 x double>
%208 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %155, <2 x double> %206, <2 x double> %157)
%209 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %159, <2 x double> %207, <2 x double> %161)
%210 = getelementptr inbounds double, double* %1, i64 %204
%211 = bitcast double* %210 to <2 x double>*
store <2 x double> %208, <2 x double>* %211
%212 = getelementptr inbounds double, double* %210, i64 2
%213 = bitcast double* %212 to <2 x double>*
store <2 x double> %209, <2 x double>* %213
br label %214
214: ; preds = %199, %203
%215 = icmp eq i64 %152, %3
br i1 %215, label %257, label %216
216: ; preds = %149, %214
%217 = phi i64 [ %8, %149 ], [ %153, %214 ]
%218 = phi i64 [ 0, %149 ], [ %152, %214 ]
br label %244
219: ; preds = %145
br i1 %147, label %220, label %270
220: ; preds = %219
%221 = and i64 %3, 1
%222 = icmp eq i64 %3, 1
br i1 %222, label %261, label %223
223: ; preds = %220
%224 = and i64 %3, -2
br label %225
225: ; preds = %225, %223
%226 = phi i64 [ 0, %223 ], [ %241, %225 ]
%227 = phi i64 [ 0, %223 ], [ %242, %225 ]
%228 = sitofp i64 %226 to double
%229 = tail call double @llvm.fmuladd.f64(double %22, double %228, double %15)
%230 = tail call double @pow(double %229, double %4)
%231 = load i64, i64* %2
%232 = add nsw i64 %231, 1
store i64 %232, i64* %2
%233 = getelementptr inbounds double, double* %1, i64 %231
store double %230, double* %233
%234 = or i64 %226, 1
%235 = sitofp i64 %234 to double
%236 = tail call double @llvm.fmuladd.f64(double %22, double %235, double %15)
%237 = tail call double @pow(double %236, double %4)
%238 = load i64, i64* %2
%239 = add nsw i64 %238, 1
store i64 %239, i64* %2
%240 = getelementptr inbounds double, double* %1, i64 %238
store double %237, double* %240
%241 = add nuw nsw i64 %226, 2
%242 = add i64 %227, 2
%243 = icmp eq i64 %242, %224
br i1 %243, label %259, label %225
244: ; preds = %216, %244
%245 = phi i64 [ %249, %244 ], [ %217, %216 ]
%246 = phi i64 [ %251, %244 ], [ %218, %216 ]
%247 = sitofp i64 %246 to double
%248 = tail call double @llvm.fmuladd.f64(double %22, double %247, double %15)
%249 = add nsw i64 %245, 1
%250 = getelementptr inbounds double, double* %1, i64 %245
store double %248, double* %250
%251 = add nuw nsw i64 %246, 1
%252 = icmp eq i64 %251, %3
br i1 %252, label %257, label %244
253: ; preds = %62, %57
%254 = phi i64 [ %30, %57 ], [ %68, %62 ]
store i64 %254, i64* %2
br label %270
255: ; preds = %134, %129
%256 = phi i64 [ %80, %129 ], [ %141, %134 ]
store i64 %256, i64* %2
br label %270
257: ; preds = %244, %214
%258 = phi i64 [ %153, %214 ], [ %249, %244 ]
store i64 %258, i64* %2
br label %270
259: ; preds = %225
%260 = sitofp i64 %241 to double
br label %261
261: ; preds = %259, %220
%262 = phi double [ 0.000000e+00, %220 ], [ %260, %259 ]
%263 = icmp eq i64 %221, 0
br i1 %263, label %270, label %264
264: ; preds = %261
%265 = tail call double @llvm.fmuladd.f64(double %22, double %262, double %15)
%266 = tail call double @pow(double %265, double %4)
%267 = load i64, i64* %2
%268 = add nsw i64 %267, 1
store i64 %268, i64* %2
%269 = getelementptr inbounds double, double* %1, i64 %267
store double %266, double* %269
br label %270
270: ; preds = %264, %261, %148, %257, %219, %74, %255, %24, %253, %17
ret void
}