#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 */
double M_PI;
double exp(double);
int /*<<< orphan*/ fgamma_set(int, double, double *);
int /*<<< orphan*/ naiA_1d(double *, int, int, double, double, double, double);
double nai(double x1, double y1, double z1, double norm1, int l1, int m1,
           int n1, double alpha1, double x2, double y2, double z2, double norm2,
           int l2, int m2, int n2, double alpha2, double x3, double y3,
           double z3) {
  double eta, xp, yp, zp, sum, rab2, rcp2;
  double Ax[2 * 8 + 1], Ay[2 * 8 + 1], Az[2 * 8 + 1];
  double F[2 * 8 + 1];
  double pre;
  int kX, kY, kZ;
  eta = 1.0 / (alpha1 + alpha2);
  xp = (alpha1 * x1 + alpha2 * x2) * eta;
  yp = (alpha1 * y1 + alpha2 * y2) * eta;
  zp = (alpha1 * z1 + alpha2 * z2) * eta;
  rab2 =
      ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2));
  rcp2 =
      ((x3 - xp) * (x3 - xp) + (y3 - yp) * (y3 - yp) + (z3 - zp) * (z3 - zp));
  pre = norm1 * norm2 * 2 * M_PI * eta * exp(-alpha1 * alpha2 * rab2 * eta);
  if (pre < 1.0E-15)
    return 0.0;
  naiA_1d(Ax, l1, l2, xp - x1, xp - x2, xp - x3, eta);
  naiA_1d(Ay, m1, m2, yp - y1, yp - y2, yp - y3, eta);
  naiA_1d(Az, n1, n2, zp - z1, zp - z2, zp - z3, eta);
  fgamma_set(l1 + l2 + m1 + m2 + n1 + n2, rcp2 / eta, F);
  sum = 0.0;
  for (kX = 0; kX < l1 + l2 + 1; kX++)
    for (kY = 0; kY < m1 + m2 + 1; kY++)
      for (kZ = 0; kZ < n1 + n2 + 1; kZ++)
        sum += Ax[kX] * Ay[kY] * Az[kZ] * F[kX + kY + kZ];
  return -pre * sum;
}


x86 assembly (clang, -O0):
<nai>:
push   %rbp
mov    %rsp,%rbp
sub    $0x300,%rsp
movsd  0x30(%rbp),%xmm8
movsd  0x28(%rbp),%xmm8
movsd  0x20(%rbp),%xmm8
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
movsd  %xmm3,-0x28(%rbp)
mov    %edi,-0x2c(%rbp)
mov    %esi,-0x30(%rbp)
mov    %edx,-0x34(%rbp)
movsd  %xmm4,-0x40(%rbp)
movsd  %xmm5,-0x48(%rbp)
movsd  %xmm6,-0x50(%rbp)
movsd  %xmm7,-0x58(%rbp)
mov    %ecx,-0x5c(%rbp)
mov    %r8d,-0x60(%rbp)
mov    %r9d,-0x64(%rbp)
movsd  -0x40(%rbp),%xmm1
addsd  0x18(%rbp),%xmm1
movsd  0xe69(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm2
movsd  0x18(%rbp),%xmm1
mulsd  -0x48(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm2
movsd  0x18(%rbp),%xmm1
mulsd  -0x50(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
movsd  0x18(%rbp),%xmm1
mulsd  -0x58(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x10(%rbp),%xmm1
subsd  -0x48(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm2
subsd  -0x48(%rbp),%xmm2
movsd  -0x18(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm3
subsd  -0x50(%rbp),%xmm3
mulsd  %xmm3,%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  -0x20(%rbp),%xmm0
subsd  -0x58(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
subsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  0x20(%rbp),%xmm1
subsd  -0x78(%rbp),%xmm1
movsd  0x20(%rbp),%xmm2
subsd  -0x78(%rbp),%xmm2
movsd  0x28(%rbp),%xmm0
subsd  -0x80(%rbp),%xmm0
movsd  0x28(%rbp),%xmm3
subsd  -0x80(%rbp),%xmm3
mulsd  %xmm3,%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x30(%rbp),%xmm0
subsd  -0x88(%rbp),%xmm0
ff
movsd  0x30(%rbp),%xmm2
subsd  -0x88(%rbp),%xmm2
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
mulsd  0x10(%rbp),%xmm0
movsd  0xd1b(%rip),%xmm1
mulsd  %xmm1,%xmm0
mov    0x2cf0(%rip),%rax
mulsd  (%rax),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x300(%rbp)
ff
movsd  -0x40(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  0x18(%rbp),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
mulsd  -0x70(%rbp),%xmm0
call   1050 <exp@plt>
movaps %xmm0,%xmm1
movsd  -0x300(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x2e8(%rbp)
ff
movsd  0xca5(%rip),%xmm0
ucomisd -0x2e8(%rbp),%xmm0
ff
jbe    1376 <nai+0x246>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    158e <nai+0x45e>
lea    -0x130(%rbp),%rdi
mov    -0x2c(%rbp),%esi
mov    -0x5c(%rbp),%edx
movsd  -0x78(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm1
subsd  -0x48(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm2
subsd  0x20(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm3
call   1040 <naiA_1d@plt>
lea    -0x1c0(%rbp),%rdi
mov    -0x30(%rbp),%esi
mov    -0x60(%rbp),%edx
movsd  -0x80(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
subsd  -0x50(%rbp),%xmm1
movsd  -0x80(%rbp),%xmm2
subsd  0x28(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm3
call   1040 <naiA_1d@plt>
lea    -0x250(%rbp),%rdi
mov    -0x34(%rbp),%esi
mov    -0x64(%rbp),%edx
movsd  -0x88(%rbp),%xmm0
ff
subsd  -0x20(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm1
ff
subsd  -0x58(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm2
ff
subsd  0x30(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm3
call   1040 <naiA_1d@plt>
mov    -0x2c(%rbp),%edi
add    -0x5c(%rbp),%edi
add    -0x30(%rbp),%edi
add    -0x60(%rbp),%edi
add    -0x34(%rbp),%edi
add    -0x64(%rbp),%edi
movsd  -0xa0(%rbp),%xmm0
ff
divsd  -0x70(%rbp),%xmm0
lea    -0x2e0(%rbp),%rsi
call   1030 <fgamma_set@plt>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movl   $0x0,-0x2ec(%rbp)
mov    -0x2ec(%rbp),%eax
mov    -0x2c(%rbp),%ecx
add    -0x5c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1562 <nai+0x432>
movl   $0x0,-0x2f0(%rbp)
mov    -0x2f0(%rbp),%eax
mov    -0x30(%rbp),%ecx
add    -0x60(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1549 <nai+0x419>
movl   $0x0,-0x2f4(%rbp)
mov    -0x2f4(%rbp),%eax
mov    -0x34(%rbp),%ecx
add    -0x64(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1530 <nai+0x400>
movslq -0x2ec(%rbp),%rax
movsd  -0x130(%rbp,%rax,8),%xmm0
ff ff
movslq -0x2f0(%rbp),%rax
mulsd  -0x1c0(%rbp,%rax,8),%xmm0
ff ff
movslq -0x2f4(%rbp),%rax
mulsd  -0x250(%rbp,%rax,8),%xmm0
ff ff
mov    -0x2ec(%rbp),%eax
add    -0x2f0(%rbp),%eax
add    -0x2f4(%rbp),%eax
cltq
movsd  -0x2e0(%rbp,%rax,8),%xmm2
ff ff
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x2f4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2f4(%rbp)
jmp    14a0 <nai+0x370>
jmp    1535 <nai+0x405>
mov    -0x2f0(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2f0(%rbp)
jmp    147f <nai+0x34f>
jmp    154e <nai+0x41e>
mov    -0x2ec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2ec(%rbp)
jmp    145e <nai+0x32e>
movsd  -0x2e8(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x300,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<nai>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x2b8,%rsp
mov    %r9d,%r15d
mov    %r8d,%r14d
mov    %ecx,%r13d
mov    %edx,%r12d
mov    %esi,%ebx
mov    %edi,%ebp
movsd  0x2f8(%rsp),%xmm9
movapd %xmm4,%xmm10
addsd  %xmm9,%xmm10
movsd  0xe92(%rip),%xmm8
divsd  %xmm10,%xmm8
movsd  %xmm0,0x60(%rsp)
movsd  %xmm5,0x68(%rsp)
subsd  %xmm5,%xmm0
movsd  %xmm1,0x10(%rsp)
movsd  %xmm6,0x18(%rsp)
subsd  %xmm6,%xmm1
mulsd  %xmm1,%xmm1
mulsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm2,0x20(%rsp)
movapd %xmm2,%xmm1
movsd  %xmm7,0x28(%rsp)
subsd  %xmm7,%xmm1
mulsd  %xmm1,%xmm1
addsd  %xmm0,%xmm1
mulsd  0x2f0(%rsp),%xmm3
addsd  %xmm3,%xmm3
mov    0x2e19(%rip),%rax
mulsd  (%rax),%xmm3
mulsd  %xmm8,%xmm3
movsd  %xmm3,0x30(%rsp)
movapd 0xe2a(%rip),%xmm0
movapd %xmm4,0x40(%rsp)
xorpd  %xmm4,%xmm0
mulsd  %xmm9,%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm8,0x8(%rsp)
mulsd  %xmm8,%xmm0
call   1050 <exp@plt>
movapd %xmm0,%xmm2
mulsd  0x30(%rsp),%xmm2
xorpd  %xmm0,%xmm0
movsd  0xde8(%rip),%xmm1
ucomisd %xmm2,%xmm1
ja     14e4 <nai+0x3b4>
movapd %xmm2,0x30(%rsp)
movsd  0x310(%rsp),%xmm9
movsd  0x308(%rsp),%xmm10
movsd  0x300(%rsp),%xmm8
movsd  0x68(%rsp),%xmm11
movapd %xmm11,%xmm0
movsd  0x2f8(%rsp),%xmm3
mulsd  %xmm3,%xmm0
movapd 0x40(%rsp),%xmm6
movapd %xmm6,%xmm2
movsd  0x60(%rsp),%xmm5
mulsd  %xmm5,%xmm2
addsd  %xmm0,%xmm2
movsd  0x8(%rsp),%xmm1
mulsd  %xmm1,%xmm2
movsd  0x18(%rsp),%xmm0
mulsd  %xmm3,%xmm0
movapd %xmm6,%xmm7
mulsd  0x10(%rsp),%xmm7
addsd  %xmm0,%xmm7
mulsd  %xmm1,%xmm7
movapd %xmm7,%xmm4
movapd %xmm7,0x70(%rsp)
mulsd  0x28(%rsp),%xmm3
mulsd  0x20(%rsp),%xmm6
addsd  %xmm3,%xmm6
mulsd  %xmm1,%xmm6
movapd %xmm6,0x40(%rsp)
movapd %xmm1,%xmm3
movapd %xmm9,%xmm7
subsd  %xmm6,%xmm7
movapd %xmm8,%xmm0
subsd  %xmm2,%xmm0
movapd %xmm10,%xmm1
subsd  %xmm4,%xmm1
mulsd  %xmm1,%xmm1
mulsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
mulsd  %xmm7,%xmm7
addsd  %xmm0,%xmm7
movsd  %xmm7,0x58(%rsp)
movapd %xmm2,%xmm0
subsd  %xmm5,%xmm0
movapd %xmm2,%xmm1
subsd  %xmm11,%xmm1
subsd  %xmm8,%xmm2
lea    0x230(%rsp),%rdi
mov    %ebp,%esi
mov    %r13d,%edx
call   1040 <naiA_1d@plt>
movapd 0x70(%rsp),%xmm2
movapd %xmm2,%xmm0
subsd  0x10(%rsp),%xmm0
movapd %xmm2,%xmm1
subsd  0x18(%rsp),%xmm1
subsd  0x308(%rsp),%xmm2
lea    0x1a0(%rsp),%rdi
mov    %ebx,%esi
mov    %r14d,%edx
movsd  0x8(%rsp),%xmm3
call   1040 <naiA_1d@plt>
movapd 0x40(%rsp),%xmm2
movapd %xmm2,%xmm0
subsd  0x20(%rsp),%xmm0
movapd %xmm2,%xmm1
subsd  0x28(%rsp),%xmm1
subsd  0x310(%rsp),%xmm2
lea    0x80(%rsp),%rdi
mov    %r12d,%esi
mov    %r15d,%edx
movsd  0x8(%rsp),%xmm3
call   1040 <naiA_1d@plt>
add    %ebp,%r13d
add    %ebx,%r14d
lea    (%r14,%r12,1),%edi
add    %r13d,%edi
add    %r15d,%edi
movsd  0x58(%rsp),%xmm0
divsd  0x8(%rsp),%xmm0
lea    0x110(%rsp),%rsi
call   1030 <fgamma_set@plt>
test   %r13d,%r13d
js     14ca <nai+0x39a>
lea    (%r15,%r12,1),%r10d
lea    (%r15,%r12,1),%r9d
add    $0x1,%r9d
lea    0x1(%r14),%edx
add    $0x1,%r13d
mov    %r9d,%esi
and    $0xfffffffe,%esi
lea    0x118(%rsp),%r8
xorpd  %xmm0,%xmm0
xor    %ebp,%ebp
movapd 0x30(%rsp),%xmm3
jmp    1421 <nai+0x2f1>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rbp
add    $0x8,%r8
cmp    %r13,%rbp
je     14d4 <nai+0x3a4>
test   %r14d,%r14d
js     1410 <nai+0x2e0>
mov    %r8,%rdi
xor    %ebx,%ebx
jmp    143d <nai+0x30d>
nopl   (%rax)
add    $0x1,%rbx
add    $0x8,%rdi
cmp    %rdx,%rbx
je     1410 <nai+0x2e0>
test   %r10d,%r10d
js     1430 <nai+0x300>
movsd  0x230(%rsp,%rbp,8),%xmm1
mulsd  0x1a0(%rsp,%rbx,8),%xmm1
je     14a0 <nai+0x370>
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movsd  0x80(%rsp,%rcx,8),%xmm2
mulsd  %xmm1,%xmm2
mulsd  -0x8(%rdi,%rcx,8),%xmm2
addsd  %xmm0,%xmm2
movsd  0x88(%rsp,%rcx,8),%xmm0
mulsd  %xmm1,%xmm0
mulsd  (%rdi,%rcx,8),%xmm0
addsd  %xmm2,%xmm0
add    $0x2,%rcx
cmp    %rcx,%rsi
jne    1460 <nai+0x330>
test   $0x1,%r9b
je     1430 <nai+0x300>
jmp    14a8 <nai+0x378>
xchg   %ax,%ax
xor    %ecx,%ecx
test   $0x1,%r9b
je     1430 <nai+0x300>
lea    (%rbx,%rbp,1),%rax
mulsd  0x80(%rsp,%rcx,8),%xmm1
add    %rcx,%rax
mulsd  0x110(%rsp,%rax,8),%xmm1
addsd  %xmm1,%xmm0
jmp    1430 <nai+0x300>
xorpd  %xmm0,%xmm0
movapd 0x30(%rsp),%xmm3
xorpd  0xb34(%rip),%xmm3
mulsd  %xmm0,%xmm3
movapd %xmm3,%xmm0
add    $0x2b8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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