#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*/ fft_free();
int fftradix(double *, double *, size_t, int const, size_t, int, int, int);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *);
size_t sqrt(size_t);
int /*<<< orphan*/ stderr;
int fftn(int ndim, const int dims[], double Re[], double Im[], int iSign,
         double scaling) {
  size_t nTotal;
  int maxFactors, maxPerm;
  nTotal = 1;
  if (ndim) {
    if (dims != NULL) {
      int i;
      for (i = 0; i < ndim; i++) {
        if (dims[i] <= 0)
          goto Dimension_Error;
        nTotal *= dims[i];
      }
    } else
      nTotal *= ndim;
  } else {
    int i;
    if (dims == NULL)
      goto Dimension_Error;
    for (ndim = i = 0; dims[i]; i++) {
      if (dims[i] <= 0)
        goto Dimension_Error;
      nTotal *= dims[i];
      ndim++;
    }
  }
  if (dims != NULL) {
    int i;
    for (maxFactors = maxPerm = 1, i = 0; i < ndim; i++) {
      if (dims[i] > maxFactors)
        maxFactors = dims[i];
      if (dims[i] > maxPerm)
        maxPerm = dims[i];
    }
  } else {
    maxFactors = maxPerm = nTotal;
  }
  if (dims != NULL) {
    size_t nSpan = 1;
    int i;
    for (i = 0; i < ndim; i++) {
      int ret;
      nSpan *= dims[i];
      ret =
          fftradix(Re, Im, nTotal, dims[i], nSpan, iSign, maxFactors, maxPerm);
      if (ret)
        return ret;
    }
  } else {
    int ret;
    ret = fftradix(Re, Im, nTotal, nTotal, nTotal, iSign, maxFactors, maxPerm);
    if (ret)
      return ret;
  }
  if (scaling && scaling != 1.0) {
    int i;
    if (iSign < 0)
      iSign = -iSign;
    if (scaling < 0.0)
      scaling = (scaling < -1.0) ? sqrt(nTotal) : nTotal;
    scaling = 1.0 / scaling;
    for (i = 0; i < nTotal; i += iSign) {
      Re[i] *= scaling;
      Im[i] *= scaling;
    }
  }
  return 0;
Dimension_Error:
  fprintf(stderr, "Error: "
                  "fftn"
                  "() - dimension error\n");
  fft_free();
  return -1;
}


x86 assembly (clang, -O0):
<fftn>:
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    %r8d,-0x24(%rbp)
movsd  %xmm0,-0x30(%rbp)
movq   $0x1,-0x38(%rbp)
cmpl   $0x0,-0x8(%rbp)
je     11e4 <fftn+0xa4>
cmpq   $0x0,-0x10(%rbp)
je     11d2 <fftn+0x92>
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    11cd <fftn+0x8d>
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jg     11aa <fftn+0x6a>
jmp    1507 <fftn+0x3c7>
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movslq (%rax,%rcx,4),%rax
imul   -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1187 <fftn+0x47>
jmp    11df <fftn+0x9f>
movslq -0x8(%rbp),%rax
imul   -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
jmp    125c <fftn+0x11c>
cmpq   $0x0,-0x10(%rbp)
jne    11f4 <fftn+0xb4>
jmp    1507 <fftn+0x3c7>
movl   $0x0,-0x48(%rbp)
movl   $0x0,-0x8(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
je     1257 <fftn+0x117>
mov    -0x10(%rbp),%rax
movslq -0x48(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jg     122b <fftn+0xeb>
jmp    1507 <fftn+0x3c7>
mov    -0x10(%rbp),%rax
movslq -0x48(%rbp),%rcx
movslq (%rax,%rcx,4),%rax
imul   -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1202 <fftn+0xc2>
jmp    125c <fftn+0x11c>
cmpq   $0x0,-0x10(%rbp)
je     12e4 <fftn+0x1a4>
movl   $0x1,-0x40(%rbp)
movl   $0x1,-0x3c(%rbp)
movl   $0x0,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    12df <fftn+0x19f>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x3c(%rbp),%eax
jle    12aa <fftn+0x16a>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x40(%rbp),%eax
jle    12cc <fftn+0x18c>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x40(%rbp)
jmp    12d1 <fftn+0x191>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    127c <fftn+0x13c>
jmp    12ee <fftn+0x1ae>
mov    -0x38(%rbp),%rax
mov    %eax,-0x40(%rbp)
mov    %eax,-0x3c(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     138c <fftn+0x24c>
movq   $0x1,-0x58(%rbp)
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1387 <fftn+0x247>
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
movslq (%rax,%rcx,4),%rax
imul   -0x58(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x18(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x38(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x5c(%rbp),%rcx
mov    (%rax,%rcx,4),%ecx
mov    -0x58(%rbp),%r8
mov    -0x24(%rbp),%r9d
mov    -0x3c(%rbp),%r10d
mov    -0x40(%rbp),%eax
mov    %r10d,(%rsp)
mov    %eax,0x8(%rsp)
call   1060 <fftradix@plt>
mov    %eax,-0x60(%rbp)
cmpl   $0x0,-0x60(%rbp)
je     1374 <fftn+0x234>
mov    -0x60(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    152a <fftn+0x3ea>
jmp    1379 <fftn+0x239>
mov    -0x5c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x5c(%rbp)
jmp    1308 <fftn+0x1c8>
jmp    13d7 <fftn+0x297>
mov    -0x18(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x38(%rbp),%rdx
mov    -0x38(%rbp),%rax
mov    %eax,%ecx
mov    -0x38(%rbp),%r8
mov    -0x24(%rbp),%r9d
mov    -0x3c(%rbp),%r10d
mov    -0x40(%rbp),%eax
mov    %r10d,(%rsp)
mov    %eax,0x8(%rsp)
call   1060 <fftradix@plt>
mov    %eax,-0x64(%rbp)
cmpl   $0x0,-0x64(%rbp)
je     13d2 <fftn+0x292>
mov    -0x64(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    152a <fftn+0x3ea>
jmp    13d7 <fftn+0x297>
movsd  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13f4 <fftn+0x2b4>
jp     13f4 <fftn+0x2b4>
jmp    14fb <fftn+0x3bb>
movsd  -0x30(%rbp),%xmm0
movsd  0xbff(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1416 <fftn+0x2d6>
jp     1416 <fftn+0x2d6>
jmp    14fb <fftn+0x3bb>
cmpl   $0x0,-0x24(%rbp)
jge    1428 <fftn+0x2e8>
xor    %eax,%eax
sub    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    1493 <fftn+0x353>
movsd  0xbca(%rip),%xmm0
ucomisd -0x30(%rbp),%xmm0
jbe    145b <fftn+0x31b>
mov    -0x38(%rbp),%rdi
call   1050 <sqrt@plt>
mov    %rax,-0x70(%rbp)
jmp    1463 <fftn+0x323>
mov    -0x38(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x70(%rbp),%rax
movq   %rax,%xmm0
movaps 0xb9d(%rip),%xmm1
punpckldq %xmm1,%xmm0
movapd 0xba1(%rip),%xmm1
subpd  %xmm1,%xmm0
movaps %xmm0,%xmm1
unpckhpd %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xb65(%rip),%xmm0
divsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x68(%rbp)
movslq -0x68(%rbp),%rax
cmp    -0x38(%rbp),%rax
jae    14f6 <fftn+0x3b6>
movsd  -0x30(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x68(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x30(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x68(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
add    -0x68(%rbp),%eax
mov    %eax,-0x68(%rbp)
jmp    14ac <fftn+0x36c>
jmp    14fb <fftn+0x3bb>
movl   $0x0,-0x4(%rbp)
jmp    152a <fftn+0x3ea>
mov    0x2ad2(%rip),%rax
mov    (%rax),%edi
lea    0xb19(%rip),%rsi
call   1030 <fprintf@plt>
mov    $0x0,%al
call   1040 <fft_free@plt>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fftn>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
movdqa %xmm0,%xmm11
mov    %r8d,%r13d
mov    %rcx,%r15
mov    %rdx,%r12
test   %edi,%edi
je     1196 <fftn+0x56>
mov    %edi,%ecx
test   %rsi,%rsi
je     1223 <fftn+0xe3>
test   %ecx,%ecx
jle    125d <fftn+0x11d>
mov    %ecx,%eax
mov    $0x1,%ebx
xor    %edx,%edx
nopl   0x0(%rax)
mov    (%rsi,%rdx,4),%edi
test   %edi,%edi
jle    11fd <fftn+0xbd>
imul   %rdi,%rbx
add    $0x1,%rdx
cmp    %rdx,%rax
jne    1180 <fftn+0x40>
jmp    11c6 <fftn+0x86>
test   %rsi,%rsi
je     11fd <fftn+0xbd>
mov    (%rsi),%eax
mov    $0x1,%ebx
test   %eax,%eax
je     1550 <fftn+0x410>
xor    %ecx,%ecx
nopl   0x0(%rax)
test   %eax,%eax
jle    11fd <fftn+0xbd>
mov    %eax,%eax
imul   %rax,%rbx
mov    0x4(%rsi,%rcx,4),%eax
add    $0x1,%rcx
test   %eax,%eax
jne    11b0 <fftn+0x70>
test   %ecx,%ecx
jle    1550 <fftn+0x410>
mov    %ecx,%r8d
cmp    $0x8,%ecx
mov    %r15,0x18(%rsp)
mov    %r12,0x10(%rsp)
mov    %r13d,0x4(%rsp)
mov    %rbx,0x8(%rsp)
jae    1267 <fftn+0x127>
mov    $0x1,%r15d
xor    %eax,%eax
mov    $0x1,%r14d
jmp    14b0 <fftn+0x370>
mov    0x2ddc(%rip),%rax
mov    (%rax),%edi
lea    0xe33(%rip),%rsi
call   1030 <fprintf@plt>
xor    %eax,%eax
call   1040 <fft_free@plt>
mov    $0xffffffff,%edx
jmp    161c <fftn+0x4dc>
movslq %ecx,%rbx
mov    %r12,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
mov    %rbx,%r8
mov    %r13d,%r9d
push   %rcx
push   %rcx
movdqa %xmm11,0x30(%rsp)
call   1060 <fftradix@plt>
movdqa 0x30(%rsp),%xmm11
add    $0x10,%rsp
mov    %eax,%edx
test   %eax,%eax
jne    161c <fftn+0x4dc>
jmp    1550 <fftn+0x410>
mov    $0x1,%ebx
jmp    1550 <fftn+0x410>
mov    %r8d,%eax
and    $0xfffffff8,%eax
lea    -0x8(%rax),%rdi
mov    %rdi,%rdx
shr    $0x3,%rdx
add    $0x1,%rdx
test   %rdi,%rdi
je     162d <fftn+0x4ed>
mov    %rdx,%rdi
and    $0xfffffffffffffffe,%rdi
movdqa 0xd6c(%rip),%xmm0
xor    %ebp,%ebp
movdqa %xmm0,%xmm1
movdqa %xmm0,%xmm3
movdqa %xmm0,%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqu (%rsi,%rbp,4),%xmm5
movdqu 0x10(%rsi,%rbp,4),%xmm10
movdqu 0x20(%rsi,%rbp,4),%xmm9
movdqu 0x30(%rsi,%rbp,4),%xmm8
movdqa %xmm5,%xmm6
pcmpgtd %xmm3,%xmm6
movdqa %xmm5,%xmm4
pand   %xmm6,%xmm4
pandn  %xmm3,%xmm6
por    %xmm4,%xmm6
movdqa %xmm10,%xmm7
pcmpgtd %xmm2,%xmm7
movdqa %xmm10,%xmm3
pand   %xmm7,%xmm3
pandn  %xmm2,%xmm7
por    %xmm3,%xmm7
movdqa %xmm5,%xmm4
pcmpgtd %xmm0,%xmm4
pand   %xmm4,%xmm5
pandn  %xmm0,%xmm4
por    %xmm5,%xmm4
movdqa %xmm10,%xmm5
pcmpgtd %xmm1,%xmm5
pand   %xmm5,%xmm10
pandn  %xmm1,%xmm5
por    %xmm10,%xmm5
movdqa %xmm9,%xmm3
pcmpgtd %xmm6,%xmm3
movdqa %xmm9,%xmm0
pand   %xmm3,%xmm0
pandn  %xmm6,%xmm3
por    %xmm0,%xmm3
movdqa %xmm8,%xmm2
pcmpgtd %xmm7,%xmm2
movdqa %xmm8,%xmm0
pand   %xmm2,%xmm0
pandn  %xmm7,%xmm2
por    %xmm0,%xmm2
movdqa %xmm9,%xmm0
pcmpgtd %xmm4,%xmm0
pand   %xmm0,%xmm9
pandn  %xmm4,%xmm0
por    %xmm9,%xmm0
movdqa %xmm8,%xmm1
pcmpgtd %xmm5,%xmm1
pand   %xmm1,%xmm8
pandn  %xmm5,%xmm1
por    %xmm8,%xmm1
add    $0x10,%rbp
add    $0xfffffffffffffffe,%rdi
jne    12b0 <fftn+0x170>
test   $0x1,%dl
je     1415 <fftn+0x2d5>
movdqu (%rsi,%rbp,4),%xmm5
movdqu 0x10(%rsi,%rbp,4),%xmm8
movdqa %xmm5,%xmm6
pcmpgtd %xmm3,%xmm6
movdqa %xmm5,%xmm7
pand   %xmm6,%xmm7
pandn  %xmm3,%xmm6
por    %xmm7,%xmm6
movdqa %xmm8,%xmm7
pcmpgtd %xmm2,%xmm7
movdqa %xmm8,%xmm3
pand   %xmm7,%xmm3
pandn  %xmm2,%xmm7
por    %xmm3,%xmm7
movdqa %xmm5,%xmm4
pcmpgtd %xmm0,%xmm4
pand   %xmm4,%xmm5
pandn  %xmm0,%xmm4
por    %xmm5,%xmm4
movdqa %xmm8,%xmm5
pcmpgtd %xmm1,%xmm5
pand   %xmm5,%xmm8
pandn  %xmm1,%xmm5
por    %xmm8,%xmm5
movdqa %xmm6,%xmm3
movdqa %xmm7,%xmm2
movdqa %xmm4,%xmm0
movdqa %xmm5,%xmm1
movdqa %xmm3,%xmm4
pcmpgtd %xmm2,%xmm4
pand   %xmm4,%xmm3
pandn  %xmm2,%xmm4
por    %xmm3,%xmm4
pshufd $0xee,%xmm4,%xmm2
movdqa %xmm4,%xmm3
pcmpgtd %xmm2,%xmm3
pand   %xmm3,%xmm4
pandn  %xmm2,%xmm3
por    %xmm4,%xmm3
pshufd $0x55,%xmm3,%xmm2
movdqa %xmm3,%xmm4
pcmpgtd %xmm2,%xmm4
pand   %xmm4,%xmm3
pandn  %xmm2,%xmm4
por    %xmm3,%xmm4
movd   %xmm4,%r14d
movdqa %xmm0,%xmm2
pcmpgtd %xmm1,%xmm2
pand   %xmm2,%xmm0
pandn  %xmm1,%xmm2
por    %xmm0,%xmm2
pshufd $0xee,%xmm2,%xmm0
movdqa %xmm2,%xmm1
pcmpgtd %xmm0,%xmm1
pand   %xmm1,%xmm2
pandn  %xmm0,%xmm1
por    %xmm2,%xmm1
pshufd $0x55,%xmm1,%xmm0
movdqa %xmm1,%xmm2
pcmpgtd %xmm0,%xmm2
pand   %xmm2,%xmm1
pandn  %xmm0,%xmm2
por    %xmm1,%xmm2
movd   %xmm2,%r15d
cmp    %r8,%rax
je     14ca <fftn+0x38a>
mov    (%rsi,%rax,4),%edx
cmp    %r14d,%edx
cmovg  %edx,%r14d
cmp    %r15d,%edx
cmovg  %edx,%r15d
add    $0x1,%rax
cmp    %rax,%r8
jne    14b0 <fftn+0x370>
test   %ecx,%ecx
jle    153c <fftn+0x3fc>
movdqa %xmm11,0x20(%rsp)
mov    $0x1,%r12d
xor    %r13d,%r13d
xchg   %ax,%ax
mov    %r8,%rbx
mov    %rsi,%rbp
movslq (%rsi,%r13,4),%rcx
imul   %rcx,%r12
mov    0x10(%rsp),%rdi
mov    0x18(%rsp),%rsi
mov    0x8(%rsp),%rdx
mov    %r12,%r8
mov    0x4(%rsp),%r9d
push   %r15
push   %r14
call   1060 <fftradix@plt>
add    $0x10,%rsp
test   %eax,%eax
jne    161a <fftn+0x4da>
add    $0x1,%r13
mov    %rbx,%r8
cmp    %r13,%rbx
mov    %rbp,%rsi
jne    14e0 <fftn+0x3a0>
mov    0x18(%rsp),%r15
mov    0x10(%rsp),%r12
movdqa 0x20(%rsp),%xmm11
jmp    1546 <fftn+0x406>
mov    0x18(%rsp),%r15
mov    0x10(%rsp),%r12
mov    0x4(%rsp),%r13d
mov    0x8(%rsp),%rbx
xor    %edx,%edx
pxor   %xmm0,%xmm0
ucomisd %xmm0,%xmm11
jne    1563 <fftn+0x423>
jnp    161c <fftn+0x4dc>
ucomisd 0xac4(%rip),%xmm11
jne    1574 <fftn+0x434>
jnp    161c <fftn+0x4dc>
mov    %r13d,%r14d
neg    %r14d
cmovs  %r13d,%r14d
xorpd  %xmm0,%xmm0
ucomisd %xmm11,%xmm0
jbe    15c9 <fftn+0x489>
movsd  0xaa7(%rip),%xmm0
ucomisd %xmm11,%xmm0
mov    %rbx,%rax
jbe    15a5 <fftn+0x465>
mov    %rbx,%rdi
call   1050 <sqrt@plt>
xor    %edx,%edx
movq   %rax,%xmm0
punpckldq 0xa5e(%rip),%xmm0
subpd  0xa66(%rip),%xmm0
movapd %xmm0,%xmm11
unpckhpd %xmm0,%xmm11
addsd  %xmm0,%xmm11
test   %rbx,%rbx
je     161c <fftn+0x4dc>
movsd  0xa5a(%rip),%xmm0
divsd  %xmm11,%xmm0
mov    %r14d,%eax
xor    %edx,%edx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  (%r12,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%r12,%rcx,8)
movsd  (%r15,%rcx,8),%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%r15,%rcx,8)
add    %rax,%rcx
cmp    %rcx,%rbx
ja     15f0 <fftn+0x4b0>
jmp    161c <fftn+0x4dc>
mov    %eax,%edx
mov    %edx,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
movdqa 0x9cb(%rip),%xmm0
xor    %ebp,%ebp
movdqa %xmm0,%xmm1
movdqa %xmm0,%xmm3
movdqa %xmm0,%xmm2
test   $0x1,%dl
jne    139c <fftn+0x25c>
jmp    1415 <fftn+0x2d5>

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

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