#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*/ btrfly(int, double, double, double, double, double, double,
                          double *, double *, double *, double *);
int /*<<< orphan*/ printf(char *);
int /*<<< orphan*/ resetA(double *);
void cft1st(int n, double *a, double *w) {
  int j, k1;
  double *v = w + 1;
  double *b = a + 2;
  double *c = a + 4;
  double *d = a + 6;
  double wk1r = w[2];
  double x0r = a[0] + a[2];
  double x0i = a[1] + a[3];
  double x1r = a[0] - a[2];
  double x1i = a[1] - a[3];
  double x2r = a[4] + a[6];
  double x2i = a[5] + a[7];
  double x3r = a[4] - a[6];
  double x3i = a[5] - a[7];
  a[0] = x0r + x2r;
  a[1] = x0i + x2i;
  a[4] = x0r - x2r;
  a[5] = x0i - x2i;
  a[2] = x1r - x3i;
  a[3] = x1i + x3r;
  a[6] = x1r + x3i;
  a[7] = x1i - x3r;
  x0r = a[8] + a[10];
  x0i = a[9] + a[11];
  x1r = a[8] - a[10];
  x1i = a[9] - a[11];
  x2r = a[12] + a[14];
  x2i = a[13] + a[15];
  x3r = a[12] - a[14];
  x3i = a[13] - a[15];
  a[8] = x0r + x2r;
  a[9] = x0i + x2i;
  a[12] = x2i - x0i;
  a[13] = x0r - x2r;
  x0r = x1r - x3i;
  x0i = x1i + x3r;
  a[10] = wk1r * (x0r - x0i);
  a[11] = wk1r * (x0r + x0i);
  x0r = x3i + x1r;
  x0i = x3r - x1i;
  a[14] = wk1r * (x0i - x0r);
  a[15] = wk1r * (x0i + x0r);
  printf("  // computes first 8 complexes manually\n");
#pragma mta use 100 streams
#pragma mta no scalar expansion
#pragma mta assert no dependence
  for (j = 16, k1 = 2; j < n; j += 16, k1 += 2) {
    double wk2r = w[k1];
    double wk2i = v[k1];
    double wk1r = w[k1 + k1];
    double wk1i = v[k1 + k1];
    double wk3r = wk1r - 2 * wk2i * wk1i;
    double wk3i = 2 * wk2i * wk1r - wk1i;
    resetA(a);
    btrfly(j, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, a, b, c, d);
    wk1r = w[k1 + k1 + 2];
    wk1i = v[k1 + k1 + 2];
    wk3r = wk1r - 2 * wk2r * wk1i;
    wk3i = 2 * wk2r * wk1r - wk1i;
    resetA(a);
    btrfly(j + 8, wk1r, wk1i, -wk2i, wk2r, wk3r, wk3i, a, b, c, d);
  }
}


x86 assembly (clang, -O0):
<cft1st>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x18(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
add    $0x30,%rax
mov    %rax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
addsd  -0x70(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x58(%rbp),%xmm0
addsd  -0x78(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x50(%rbp),%xmm0
subsd  -0x70(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x58(%rbp),%xmm0
subsd  -0x78(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x60(%rbp),%xmm0
subsd  -0x88(%rbp),%xmm0
ff
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x68(%rbp),%xmm0
addsd  -0x80(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x60(%rbp),%xmm0
addsd  -0x88(%rbp),%xmm0
ff
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0x68(%rbp),%xmm0
subsd  -0x80(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x10(%rbp),%rax
addsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x10(%rbp),%rax
subsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
addsd  -0x70(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x58(%rbp),%xmm0
addsd  -0x78(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x48(%rax)
movsd  -0x78(%rbp),%xmm0
subsd  -0x58(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0x50(%rbp),%xmm0
subsd  -0x70(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x68(%rax)
movsd  -0x60(%rbp),%xmm0
subsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x50(%rbp)
movsd  -0x68(%rbp),%xmm0
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
subsd  -0x58(%rbp),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x50(%rax)
movsd  -0x48(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
addsd  -0x58(%rbp),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x58(%rax)
movsd  -0x88(%rbp),%xmm0
ff
addsd  -0x60(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x80(%rbp),%xmm0
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm1
subsd  -0x50(%rbp),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x70(%rax)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm1
addsd  -0x50(%rbp),%xmm1
mulsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x78(%rax)
lea    0xb6e(%rip),%rdi
call   1050 <printf@plt>
movl   $0x10,-0x1c(%rbp)
movl   $0x2,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1740 <cft1st+0x610>
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x28(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    -0x20(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xa0(%rbp),%xmm1
ff
movsd  0xad9(%rip),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
movsd  -0xa8(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  0xa9a(%rip),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
movsd  -0xa0(%rbp),%xmm2
ff
movsd  -0xa8(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x10(%rbp),%rdi
call   1040 <resetA@plt>
mov    -0x1c(%rbp),%edi
movsd  -0xa0(%rbp),%xmm0
ff
movsd  -0xa8(%rbp),%xmm1
ff
movsd  -0x90(%rbp),%xmm2
ff
movsd  -0x98(%rbp),%xmm3
ff
movsd  -0xb0(%rbp),%xmm4
ff
movsd  -0xb8(%rbp),%xmm5
ff
mov    -0x10(%rbp),%rsi
mov    -0x30(%rbp),%rdx
mov    -0x38(%rbp),%rcx
mov    -0x40(%rbp),%r8
call   1030 <btrfly@plt>
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    -0x20(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    -0x20(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xa0(%rbp),%xmm1
ff
movsd  0x9c0(%rip),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
movsd  -0xa8(%rbp),%xmm2
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  0x981(%rip),%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
movsd  -0xa0(%rbp),%xmm2
ff
movsd  -0xa8(%rbp),%xmm1
ff
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x10(%rbp),%rdi
call   1040 <resetA@plt>
mov    -0x1c(%rbp),%edi
add    $0x8,%edi
movsd  -0xa0(%rbp),%xmm0
ff
movsd  -0xa8(%rbp),%xmm1
ff
movsd  -0x98(%rbp),%xmm2
ff
movq   %xmm2,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm2
movsd  -0x90(%rbp),%xmm3
ff
movsd  -0xb0(%rbp),%xmm4
ff
movsd  -0xb8(%rbp),%xmm5
ff
mov    -0x10(%rbp),%rsi
mov    -0x30(%rbp),%rdx
mov    -0x38(%rbp),%rcx
mov    -0x40(%rbp),%r8
call   1030 <btrfly@plt>
mov    -0x1c(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    14ad <cft1st+0x37d>
add    $0xc0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cft1st>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
mov    %rdx,%r14
mov    %edi,%ebp
movsd  0x10(%rdx),%xmm0
movupd (%rsi),%xmm1
movupd 0x10(%rsi),%xmm2
movupd 0x20(%rsi),%xmm3
movupd 0x30(%rsi),%xmm4
movapd %xmm1,%xmm5
addpd  %xmm2,%xmm5
subpd  %xmm2,%xmm1
movapd %xmm3,%xmm2
addpd  %xmm4,%xmm2
subpd  %xmm4,%xmm3
shufpd $0x1,%xmm3,%xmm3
movapd %xmm5,%xmm4
addpd  %xmm2,%xmm4
movupd %xmm4,(%rsi)
subpd  %xmm2,%xmm5
movupd %xmm5,0x20(%rsi)
movapd %xmm1,%xmm2
subpd  %xmm3,%xmm2
addpd  %xmm1,%xmm3
movapd %xmm3,%xmm1
movsd  %xmm2,%xmm1
movupd %xmm1,0x10(%rsi)
shufpd $0x2,%xmm2,%xmm3
movupd %xmm3,0x30(%rsi)
movupd 0x40(%rsi),%xmm3
movupd 0x50(%rsi),%xmm1
movapd %xmm3,%xmm2
addpd  %xmm1,%xmm2
subpd  %xmm1,%xmm3
movupd 0x60(%rsi),%xmm1
movupd 0x70(%rsi),%xmm6
movapd %xmm1,%xmm5
subpd  %xmm6,%xmm1
movapd %xmm1,%xmm4
unpckhpd %xmm1,%xmm4
movapd %xmm3,%xmm7
subsd  %xmm4,%xmm7
addsd  %xmm3,%xmm4
unpckhpd %xmm3,%xmm3
addpd  %xmm6,%xmm5
movapd %xmm2,%xmm6
addpd  %xmm5,%xmm6
movupd %xmm6,0x40(%rsi)
movapd %xmm5,%xmm6
shufpd $0x1,%xmm2,%xmm6
shufpd $0x1,%xmm5,%xmm2
subpd  %xmm2,%xmm6
movupd %xmm6,0x60(%rsi)
movapd %xmm3,%xmm2
addsd  %xmm1,%xmm2
movapd %xmm7,%xmm5
subsd  %xmm2,%xmm5
mulsd  %xmm0,%xmm5
movsd  %xmm5,0x50(%rsi)
addsd  %xmm7,%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,0x58(%rsi)
subsd  %xmm3,%xmm1
movapd %xmm1,%xmm2
subsd  %xmm4,%xmm2
mulsd  %xmm0,%xmm2
movsd  %xmm2,0x70(%rsi)
addsd  %xmm4,%xmm1
mulsd  %xmm0,%xmm1
mov    %rsi,0x28(%rsp)
movsd  %xmm1,0x78(%rsi)
lea    0xda4(%rip),%rdi
call   1040 <puts@plt>
cmp    $0x11,%ebp
jl     13ff <cft1st+0x2cf>
mov    0x28(%rsp),%rcx
lea    0x10(%rcx),%rax
mov    %rax,0x58(%rsp)
lea    0x20(%rcx),%rax
mov    %rax,0x50(%rsp)
lea    0x30(%rcx),%rax
mov    %rax,0x48(%rsp)
mov    $0x10,%r15d
mov    %ebp,0x24(%rsp)
mov    0x28(%rsp),%rbx
mov    0x58(%rsp),%r13
mov    0x48(%rsp),%r12
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsd  (%r14,%r15,1),%xmm0
movsd  %xmm0,0x18(%rsp)
movsd  0x8(%r14,%r15,1),%xmm0
movapd %xmm0,0x60(%rsp)
movsd  (%r14,%r15,2),%xmm2
movsd  %xmm2,0x8(%rsp)
movsd  0x8(%r14,%r15,2),%xmm3
movsd  %xmm3,(%rsp)
movapd %xmm0,%xmm1
addsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
mulsd  %xmm3,%xmm0
movapd %xmm2,%xmm4
subsd  %xmm0,%xmm4
movsd  %xmm4,0x10(%rsp)
mulsd  %xmm2,%xmm1
subsd  %xmm3,%xmm1
movapd %xmm1,0x30(%rsp)
mov    %rbx,%rdi
call   1050 <resetA@plt>
mov    %r15d,%edi
movsd  0x8(%rsp),%xmm0
movsd  (%rsp),%xmm1
movsd  0x18(%rsp),%xmm2
movaps 0x60(%rsp),%xmm3
movsd  0x10(%rsp),%xmm4
movaps 0x30(%rsp),%xmm5
mov    %rbx,%rsi
mov    %r13,%rdx
mov    0x50(%rsp),%rbp
mov    %rbp,%rcx
mov    %r12,%r8
call   1030 <btrfly@plt>
movsd  0x10(%r14,%r15,2),%xmm2
movsd  %xmm2,0x8(%rsp)
movsd  0x18(%r14,%r15,2),%xmm3
movsd  %xmm3,(%rsp)
movsd  0x18(%rsp),%xmm1
addsd  %xmm1,%xmm1
movapd %xmm1,%xmm0
mulsd  %xmm3,%xmm0
movapd %xmm2,%xmm4
subsd  %xmm0,%xmm4
movsd  %xmm4,0x10(%rsp)
mulsd  %xmm2,%xmm1
subsd  %xmm3,%xmm1
movsd  %xmm1,0x30(%rsp)
mov    %rbx,%rdi
call   1050 <resetA@plt>
movapd 0x60(%rsp),%xmm2
xorpd  0xc44(%rip),%xmm2
lea    0x8(%r15),%edi
movsd  0x8(%rsp),%xmm0
movsd  (%rsp),%xmm1
movsd  0x18(%rsp),%xmm3
movsd  0x10(%rsp),%xmm4
movsd  0x30(%rsp),%xmm5
mov    %rbx,%rsi
mov    %r13,%rdx
mov    %rbp,%rcx
mov    %r12,%r8
call   1030 <btrfly@plt>
mov    0x24(%rsp),%ebp
add    $0x10,%r15
cmp    %ebp,%r15d
jl     12c0 <cft1st+0x190>
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [42 x i8] c" // computes first 8 complexes manually\0A\00"
define void @cft1st(i32 %0, double* %1, double* %2) {
%4 = alloca i32
%5 = alloca double*
%6 = alloca double*
%7 = alloca i32
%8 = alloca i32
%9 = alloca double*
%10 = alloca double*
%11 = alloca double*
%12 = alloca double*
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
%24 = alloca double
%25 = alloca double
%26 = alloca double
%27 = alloca double
store i32 %0, i32* %4
store double* %1, double** %5
store double* %2, double** %6
%28 = load double*, double** %6
%29 = getelementptr inbounds double, double* %28, i64 1
store double* %29, double** %9
%30 = load double*, double** %5
%31 = getelementptr inbounds double, double* %30, i64 2
store double* %31, double** %10
%32 = load double*, double** %5
%33 = getelementptr inbounds double, double* %32, i64 4
store double* %33, double** %11
%34 = load double*, double** %5
%35 = getelementptr inbounds double, double* %34, i64 6
store double* %35, double** %12
%36 = load double*, double** %6
%37 = getelementptr inbounds double, double* %36, i64 2
%38 = load double, double* %37
store double %38, double* %13
%39 = load double*, double** %5
%40 = getelementptr inbounds double, double* %39, i64 0
%41 = load double, double* %40
%42 = load double*, double** %5
%43 = getelementptr inbounds double, double* %42, i64 2
%44 = load double, double* %43
%45 = fadd double %41, %44
store double %45, double* %14
%46 = load double*, double** %5
%47 = getelementptr inbounds double, double* %46, i64 1
%48 = load double, double* %47
%49 = load double*, double** %5
%50 = getelementptr inbounds double, double* %49, i64 3
%51 = load double, double* %50
%52 = fadd double %48, %51
store double %52, double* %15
%53 = load double*, double** %5
%54 = getelementptr inbounds double, double* %53, i64 0
%55 = load double, double* %54
%56 = load double*, double** %5
%57 = getelementptr inbounds double, double* %56, i64 2
%58 = load double, double* %57
%59 = fsub double %55, %58
store double %59, double* %16
%60 = load double*, double** %5
%61 = getelementptr inbounds double, double* %60, i64 1
%62 = load double, double* %61
%63 = load double*, double** %5
%64 = getelementptr inbounds double, double* %63, i64 3
%65 = load double, double* %64
%66 = fsub double %62, %65
store double %66, double* %17
%67 = load double*, double** %5
%68 = getelementptr inbounds double, double* %67, i64 4
%69 = load double, double* %68
%70 = load double*, double** %5
%71 = getelementptr inbounds double, double* %70, i64 6
%72 = load double, double* %71
%73 = fadd double %69, %72
store double %73, double* %18
%74 = load double*, double** %5
%75 = getelementptr inbounds double, double* %74, i64 5
%76 = load double, double* %75
%77 = load double*, double** %5
%78 = getelementptr inbounds double, double* %77, i64 7
%79 = load double, double* %78
%80 = fadd double %76, %79
store double %80, double* %19
%81 = load double*, double** %5
%82 = getelementptr inbounds double, double* %81, i64 4
%83 = load double, double* %82
%84 = load double*, double** %5
%85 = getelementptr inbounds double, double* %84, i64 6
%86 = load double, double* %85
%87 = fsub double %83, %86
store double %87, double* %20
%88 = load double*, double** %5
%89 = getelementptr inbounds double, double* %88, i64 5
%90 = load double, double* %89
%91 = load double*, double** %5
%92 = getelementptr inbounds double, double* %91, i64 7
%93 = load double, double* %92
%94 = fsub double %90, %93
store double %94, double* %21
%95 = load double, double* %14
%96 = load double, double* %18
%97 = fadd double %95, %96
%98 = load double*, double** %5
%99 = getelementptr inbounds double, double* %98, i64 0
store double %97, double* %99
%100 = load double, double* %15
%101 = load double, double* %19
%102 = fadd double %100, %101
%103 = load double*, double** %5
%104 = getelementptr inbounds double, double* %103, i64 1
store double %102, double* %104
%105 = load double, double* %14
%106 = load double, double* %18
%107 = fsub double %105, %106
%108 = load double*, double** %5
%109 = getelementptr inbounds double, double* %108, i64 4
store double %107, double* %109
%110 = load double, double* %15
%111 = load double, double* %19
%112 = fsub double %110, %111
%113 = load double*, double** %5
%114 = getelementptr inbounds double, double* %113, i64 5
store double %112, double* %114
%115 = load double, double* %16
%116 = load double, double* %21
%117 = fsub double %115, %116
%118 = load double*, double** %5
%119 = getelementptr inbounds double, double* %118, i64 2
store double %117, double* %119
%120 = load double, double* %17
%121 = load double, double* %20
%122 = fadd double %120, %121
%123 = load double*, double** %5
%124 = getelementptr inbounds double, double* %123, i64 3
store double %122, double* %124
%125 = load double, double* %16
%126 = load double, double* %21
%127 = fadd double %125, %126
%128 = load double*, double** %5
%129 = getelementptr inbounds double, double* %128, i64 6
store double %127, double* %129
%130 = load double, double* %17
%131 = load double, double* %20
%132 = fsub double %130, %131
%133 = load double*, double** %5
%134 = getelementptr inbounds double, double* %133, i64 7
store double %132, double* %134
%135 = load double*, double** %5
%136 = getelementptr inbounds double, double* %135, i64 8
%137 = load double, double* %136
%138 = load double*, double** %5
%139 = getelementptr inbounds double, double* %138, i64 10
%140 = load double, double* %139
%141 = fadd double %137, %140
store double %141, double* %14
%142 = load double*, double** %5
%143 = getelementptr inbounds double, double* %142, i64 9
%144 = load double, double* %143
%145 = load double*, double** %5
%146 = getelementptr inbounds double, double* %145, i64 11
%147 = load double, double* %146
%148 = fadd double %144, %147
store double %148, double* %15
%149 = load double*, double** %5
%150 = getelementptr inbounds double, double* %149, i64 8
%151 = load double, double* %150
%152 = load double*, double** %5
%153 = getelementptr inbounds double, double* %152, i64 10
%154 = load double, double* %153
%155 = fsub double %151, %154
store double %155, double* %16
%156 = load double*, double** %5
%157 = getelementptr inbounds double, double* %156, i64 9
%158 = load double, double* %157
%159 = load double*, double** %5
%160 = getelementptr inbounds double, double* %159, i64 11
%161 = load double, double* %160
%162 = fsub double %158, %161
store double %162, double* %17
%163 = load double*, double** %5
%164 = getelementptr inbounds double, double* %163, i64 12
%165 = load double, double* %164
%166 = load double*, double** %5
%167 = getelementptr inbounds double, double* %166, i64 14
%168 = load double, double* %167
%169 = fadd double %165, %168
store double %169, double* %18
%170 = load double*, double** %5
%171 = getelementptr inbounds double, double* %170, i64 13
%172 = load double, double* %171
%173 = load double*, double** %5
%174 = getelementptr inbounds double, double* %173, i64 15
%175 = load double, double* %174
%176 = fadd double %172, %175
store double %176, double* %19
%177 = load double*, double** %5
%178 = getelementptr inbounds double, double* %177, i64 12
%179 = load double, double* %178
%180 = load double*, double** %5
%181 = getelementptr inbounds double, double* %180, i64 14
%182 = load double, double* %181
%183 = fsub double %179, %182
store double %183, double* %20
%184 = load double*, double** %5
%185 = getelementptr inbounds double, double* %184, i64 13
%186 = load double, double* %185
%187 = load double*, double** %5
%188 = getelementptr inbounds double, double* %187, i64 15
%189 = load double, double* %188
%190 = fsub double %186, %189
store double %190, double* %21
%191 = load double, double* %14
%192 = load double, double* %18
%193 = fadd double %191, %192
%194 = load double*, double** %5
%195 = getelementptr inbounds double, double* %194, i64 8
store double %193, double* %195
%196 = load double, double* %15
%197 = load double, double* %19
%198 = fadd double %196, %197
%199 = load double*, double** %5
%200 = getelementptr inbounds double, double* %199, i64 9
store double %198, double* %200
%201 = load double, double* %19
%202 = load double, double* %15
%203 = fsub double %201, %202
%204 = load double*, double** %5
%205 = getelementptr inbounds double, double* %204, i64 12
store double %203, double* %205
%206 = load double, double* %14
%207 = load double, double* %18
%208 = fsub double %206, %207
%209 = load double*, double** %5
%210 = getelementptr inbounds double, double* %209, i64 13
store double %208, double* %210
%211 = load double, double* %16
%212 = load double, double* %21
%213 = fsub double %211, %212
store double %213, double* %14
%214 = load double, double* %17
%215 = load double, double* %20
%216 = fadd double %214, %215
store double %216, double* %15
%217 = load double, double* %13
%218 = load double, double* %14
%219 = load double, double* %15
%220 = fsub double %218, %219
%221 = fmul double %217, %220
%222 = load double*, double** %5
%223 = getelementptr inbounds double, double* %222, i64 10
store double %221, double* %223
%224 = load double, double* %13
%225 = load double, double* %14
%226 = load double, double* %15
%227 = fadd double %225, %226
%228 = fmul double %224, %227
%229 = load double*, double** %5
%230 = getelementptr inbounds double, double* %229, i64 11
store double %228, double* %230
%231 = load double, double* %21
%232 = load double, double* %16
%233 = fadd double %231, %232
store double %233, double* %14
%234 = load double, double* %20
%235 = load double, double* %17
%236 = fsub double %234, %235
store double %236, double* %15
%237 = load double, double* %13
%238 = load double, double* %15
%239 = load double, double* %14
%240 = fsub double %238, %239
%241 = fmul double %237, %240
%242 = load double*, double** %5
%243 = getelementptr inbounds double, double* %242, i64 14
store double %241, double* %243
%244 = load double, double* %13
%245 = load double, double* %15
%246 = load double, double* %14
%247 = fadd double %245, %246
%248 = fmul double %244, %247
%249 = load double*, double** %5
%250 = getelementptr inbounds double, double* %249, i64 15
store double %248, double* %250
%251 = call i32 @printf(i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str, i64 0, i64 0))
store i32 16, i32* %7
store i32 2, i32* %8
br label %252
252: ; preds = %351, %3
%253 = load i32, i32* %7
%254 = load i32, i32* %4
%255 = icmp slt i32 %253, %254
br i1 %255, label %256, label %356
256: ; preds = %252
%257 = load double*, double** %6
%258 = load i32, i32* %8
%259 = sext i32 %258 to i64
%260 = getelementptr inbounds double, double* %257, i64 %259
%261 = load double, double* %260
store double %261, double* %22
%262 = load double*, double** %9
%263 = load i32, i32* %8
%264 = sext i32 %263 to i64
%265 = getelementptr inbounds double, double* %262, i64 %264
%266 = load double, double* %265
store double %266, double* %23
%267 = load double*, double** %6
%268 = load i32, i32* %8
%269 = load i32, i32* %8
%270 = add nsw i32 %268, %269
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds double, double* %267, i64 %271
%273 = load double, double* %272
store double %273, double* %24
%274 = load double*, double** %9
%275 = load i32, i32* %8
%276 = load i32, i32* %8
%277 = add nsw i32 %275, %276
%278 = sext i32 %277 to i64
%279 = getelementptr inbounds double, double* %274, i64 %278
%280 = load double, double* %279
store double %280, double* %25
%281 = load double, double* %24
%282 = load double, double* %23
%283 = fmul double 2.000000e+00, %282
%284 = load double, double* %25
%285 = fneg double %283
%286 = call double @llvm.fmuladd.f64(double %285, double %284, double %281)
store double %286, double* %26
%287 = load double, double* %23
%288 = fmul double 2.000000e+00, %287
%289 = load double, double* %24
%290 = load double, double* %25
%291 = fneg double %290
%292 = call double @llvm.fmuladd.f64(double %288, double %289, double %291)
store double %292, double* %27
%293 = load double*, double** %5
%294 = call i32 @resetA(double* %293)
%295 = load i32, i32* %7
%296 = load double, double* %24
%297 = load double, double* %25
%298 = load double, double* %22
%299 = load double, double* %23
%300 = load double, double* %26
%301 = load double, double* %27
%302 = load double*, double** %5
%303 = load double*, double** %10
%304 = load double*, double** %11
%305 = load double*, double** %12
%306 = call i32 @btrfly(i32 %295, double %296, double %297, double %298, double %299, double %300, double %301, double* %302, double* %303, double* %304, double* %305)
%307 = load double*, double** %6
%308 = load i32, i32* %8
%309 = load i32, i32* %8
%310 = add nsw i32 %308, %309
%311 = add nsw i32 %310, 2
%312 = sext i32 %311 to i64
%313 = getelementptr inbounds double, double* %307, i64 %312
%314 = load double, double* %313
store double %314, double* %24
%315 = load double*, double** %9
%316 = load i32, i32* %8
%317 = load i32, i32* %8
%318 = add nsw i32 %316, %317
%319 = add nsw i32 %318, 2
%320 = sext i32 %319 to i64
%321 = getelementptr inbounds double, double* %315, i64 %320
%322 = load double, double* %321
store double %322, double* %25
%323 = load double, double* %24
%324 = load double, double* %22
%325 = fmul double 2.000000e+00, %324
%326 = load double, double* %25
%327 = fneg double %325
%328 = call double @llvm.fmuladd.f64(double %327, double %326, double %323)
store double %328, double* %26
%329 = load double, double* %22
%330 = fmul double 2.000000e+00, %329
%331 = load double, double* %24
%332 = load double, double* %25
%333 = fneg double %332
%334 = call double @llvm.fmuladd.f64(double %330, double %331, double %333)
store double %334, double* %27
%335 = load double*, double** %5
%336 = call i32 @resetA(double* %335)
%337 = load i32, i32* %7
%338 = add nsw i32 %337, 8
%339 = load double, double* %24
%340 = load double, double* %25
%341 = load double, double* %23
%342 = fneg double %341
%343 = load double, double* %22
%344 = load double, double* %26
%345 = load double, double* %27
%346 = load double*, double** %5
%347 = load double*, double** %10
%348 = load double*, double** %11
%349 = load double*, double** %12
%350 = call i32 @btrfly(i32 %338, double %339, double %340, double %342, double %343, double %344, double %345, double* %346, double* %347, double* %348, double* %349)
br label %351
351: ; preds = %256
%352 = load i32, i32* %7
%353 = add nsw i32 %352, 16
store i32 %353, i32* %7
%354 = load i32, i32* %8
%355 = add nsw i32 %354, 2
store i32 %355, i32* %8
br label %252
356: ; preds = %252
ret void
}

LLVM IR (-O2):
@str = [41 x i8] c" // computes first 8 complexes manually\00"
define void @cft1st(i32 %0, double* %1, double* nocapture %2) {
%4 = getelementptr inbounds double, double* %2, i64 1
%5 = getelementptr inbounds double, double* %1, i64 2
%6 = getelementptr inbounds double, double* %1, i64 4
%7 = getelementptr inbounds double, double* %1, i64 6
%8 = getelementptr inbounds double, double* %2, i64 2
%9 = load double, double* %8
%10 = bitcast double* %1 to <2 x double>*
%11 = load <2 x double>, <2 x double>* %10
%12 = bitcast double* %5 to <2 x double>*
%13 = load <2 x double>, <2 x double>* %12
%14 = fadd <2 x double> %11, %13
%15 = fsub <2 x double> %11, %13
%16 = bitcast double* %6 to <2 x double>*
%17 = load <2 x double>, <2 x double>* %16
%18 = bitcast double* %7 to <2 x double>*
%19 = load <2 x double>, <2 x double>* %18
%20 = fadd <2 x double> %17, %19
%21 = fsub <2 x double> %17, %19
%22 = shufflevector <2 x double> %21, <2 x double> poison, <2 x i32> <i32 1, i32 0>
%23 = fadd <2 x double> %14, %20
%24 = bitcast double* %1 to <2 x double>*
store <2 x double> %23, <2 x double>* %24
%25 = fsub <2 x double> %14, %20
%26 = bitcast double* %6 to <2 x double>*
store <2 x double> %25, <2 x double>* %26
%27 = fsub <2 x double> %15, %22
%28 = fadd <2 x double> %15, %22
%29 = shufflevector <2 x double> %27, <2 x double> %28, <2 x i32> <i32 0, i32 3>
%30 = bitcast double* %5 to <2 x double>*
store <2 x double> %29, <2 x double>* %30
%31 = shufflevector <2 x double> %28, <2 x double> %27, <2 x i32> <i32 0, i32 3>
%32 = bitcast double* %7 to <2 x double>*
store <2 x double> %31, <2 x double>* %32
%33 = getelementptr inbounds double, double* %1, i64 8
%34 = getelementptr inbounds double, double* %1, i64 10
%35 = bitcast double* %33 to <2 x double>*
%36 = load <2 x double>, <2 x double>* %35
%37 = getelementptr inbounds double, double* %1, i64 11
%38 = bitcast double* %34 to <2 x double>*
%39 = load <2 x double>, <2 x double>* %38
%40 = fadd <2 x double> %36, %39
%41 = fsub <2 x double> %36, %39
%42 = extractelement <2 x double> %41, i64 0
%43 = fsub <2 x double> %36, %39
%44 = extractelement <2 x double> %43, i64 1
%45 = getelementptr inbounds double, double* %1, i64 12
%46 = getelementptr inbounds double, double* %1, i64 14
%47 = bitcast double* %45 to <2 x double>*
%48 = load <2 x double>, <2 x double>* %47
%49 = getelementptr inbounds double, double* %1, i64 15
%50 = bitcast double* %46 to <2 x double>*
%51 = load <2 x double>, <2 x double>* %50
%52 = fadd <2 x double> %48, %51
%53 = fsub <2 x double> %48, %51
%54 = extractelement <2 x double> %53, i64 0
%55 = fsub <2 x double> %48, %51
%56 = extractelement <2 x double> %55, i64 1
%57 = fadd <2 x double> %40, %52
%58 = bitcast double* %33 to <2 x double>*
store <2 x double> %57, <2 x double>* %58
%59 = shufflevector <2 x double> %52, <2 x double> %40, <2 x i32> <i32 1, i32 2>
%60 = shufflevector <2 x double> %40, <2 x double> %52, <2 x i32> <i32 1, i32 2>
%61 = fsub <2 x double> %59, %60
%62 = bitcast double* %45 to <2 x double>*
store <2 x double> %61, <2 x double>* %62
%63 = fsub double %42, %56
%64 = fadd double %44, %54
%65 = fsub double %63, %64
%66 = fmul double %9, %65
store double %66, double* %34
%67 = fadd double %64, %63
%68 = fmul double %9, %67
store double %68, double* %37
%69 = fadd double %42, %56
%70 = fsub double %54, %44
%71 = fsub double %70, %69
%72 = fmul double %9, %71
store double %72, double* %46
%73 = fadd double %70, %69
%74 = fmul double %9, %73
store double %74, double* %49
%75 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([41 x i8], [41 x i8]* @str, i64 0, i64 0))
%76 = icmp sgt i32 %0, 16
br i1 %76, label %77, label %113
77: ; preds = %3, %77
%78 = phi i64 [ %111, %77 ], [ 2, %3 ]
%79 = phi i32 [ %110, %77 ], [ 16, %3 ]
%80 = getelementptr inbounds double, double* %2, i64 %78
%81 = load double, double* %80
%82 = getelementptr inbounds double, double* %4, i64 %78
%83 = load double, double* %82
%84 = shl nuw nsw i64 %78, 1
%85 = getelementptr inbounds double, double* %2, i64 %84
%86 = load double, double* %85
%87 = getelementptr inbounds double, double* %4, i64 %84
%88 = load double, double* %87
%89 = fmul double %83, 2.000000e+00
%90 = fneg double %89
%91 = tail call double @llvm.fmuladd.f64(double %90, double %88, double %86)
%92 = fneg double %88
%93 = tail call double @llvm.fmuladd.f64(double %89, double %86, double %92)
%94 = tail call i32 @resetA(double* %1)
%95 = tail call i32 @btrfly(i32 %79, double %86, double %88, double %81, double %83, double %91, double %93, double* %1, double* %5, double* %6, double* %7)
%96 = or i64 %84, 2
%97 = getelementptr inbounds double, double* %2, i64 %96
%98 = load double, double* %97
%99 = getelementptr inbounds double, double* %4, i64 %96
%100 = load double, double* %99
%101 = fmul double %81, 2.000000e+00
%102 = fneg double %101
%103 = tail call double @llvm.fmuladd.f64(double %102, double %100, double %98)
%104 = fneg double %100
%105 = tail call double @llvm.fmuladd.f64(double %101, double %98, double %104)
%106 = tail call i32 @resetA(double* %1)
%107 = or i32 %79, 8
%108 = fneg double %83
%109 = tail call i32 @btrfly(i32 %107, double %98, double %100, double %108, double %81, double %103, double %105, double* %1, double* %5, double* %6, double* %7)
%110 = add nuw nsw i32 %79, 16
%111 = add nuw i64 %78, 2
%112 = icmp slt i32 %110, %0
br i1 %112, label %77, label %113
113: ; preds = %77, %3
ret void
}