#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 *A_array(int, int, double, double, double, double);
double Fgamma(int, double);
double dist2(double, double, double, double, double, double);
double exp(double);
int /*<<< orphan*/ free(double *);
double product_center_1D(double, double, double, double);
double nuclear_attraction(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) {
  int I, J, K;
  double gamma, xp, yp, zp, sum, rab2, rcp2;
  double *Ax, *Ay, *Az;
  gamma = alpha1 + alpha2;
  xp = product_center_1D(alpha1, x1, alpha2, x2);
  yp = product_center_1D(alpha1, y1, alpha2, y2);
  zp = product_center_1D(alpha1, z1, alpha2, z2);
  rab2 = dist2(x1, y1, z1, x2, y2, z2);
  rcp2 = dist2(x3, y3, z3, xp, yp, zp);
  Ax = A_array(l1, l2, xp - x1, xp - x2, xp - x3, gamma);
  Ay = A_array(m1, m2, yp - y1, yp - y2, yp - y3, gamma);
  Az = A_array(n1, n2, zp - z1, zp - z2, zp - z3, gamma);
  sum = 0.;
  for (I = 0; I < l1 + l2 + 1; I++)
    for (J = 0; J < m1 + m2 + 1; J++)
      for (K = 0; K < n1 + n2 + 1; K++)
        sum += Ax[I] * Ay[J] * Az[K] * Fgamma(I + J + K, rcp2 * gamma);
  free(Ax);
  free(Ay);
  free(Az);
  return -norm1 * norm2 * 2 * 3.14159265358979323846 / gamma *
         exp(-alpha1 * alpha2 * rab2 / gamma) * sum;
}


x86 assembly (clang, -O0):
<nuclear_attraction>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
movsd  0x30(%rbp),%xmm8
movsd  0x28(%rbp),%xmm8
movsd  0x20(%rbp),%xmm8
movsd  0x18(%rbp),%xmm8
movsd  0x10(%rbp),%xmm8
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
mov    %edi,-0x24(%rbp)
mov    %esi,-0x28(%rbp)
mov    %edx,-0x2c(%rbp)
movsd  %xmm4,-0x38(%rbp)
movsd  %xmm5,-0x40(%rbp)
movsd  %xmm6,-0x48(%rbp)
movsd  %xmm7,-0x50(%rbp)
mov    %ecx,-0x54(%rbp)
mov    %r8d,-0x58(%rbp)
mov    %r9d,-0x5c(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  0x18(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x8(%rbp),%xmm1
movsd  0x18(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm3
call   1050 <product_center_1D@plt>
movsd  %xmm0,-0x78(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
movsd  0x18(%rbp),%xmm2
movsd  -0x48(%rbp),%xmm3
call   1050 <product_center_1D@plt>
movsd  %xmm0,-0x80(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x18(%rbp),%xmm1
movsd  0x18(%rbp),%xmm2
movsd  -0x50(%rbp),%xmm3
call   1050 <product_center_1D@plt>
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x8(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm2
movsd  -0x40(%rbp),%xmm3
movsd  -0x48(%rbp),%xmm4
movsd  -0x50(%rbp),%xmm5
call   1060 <dist2@plt>
movsd  %xmm0,-0x98(%rbp)
ff
movsd  0x20(%rbp),%xmm0
movsd  0x28(%rbp),%xmm1
movsd  0x30(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm3
movsd  -0x80(%rbp),%xmm4
movsd  -0x88(%rbp),%xmm5
ff
call   1060 <dist2@plt>
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x24(%rbp),%edi
mov    -0x54(%rbp),%esi
movsd  -0x78(%rbp),%xmm0
subsd  -0x8(%rbp),%xmm0
movsd  -0x78(%rbp),%xmm1
subsd  -0x40(%rbp),%xmm1
movsd  -0x78(%rbp),%xmm2
subsd  0x20(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm3
call   1080 <A_array@plt>
mov    %rax,-0xa8(%rbp)
mov    -0x28(%rbp),%edi
mov    -0x58(%rbp),%esi
movsd  -0x80(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  -0x80(%rbp),%xmm1
subsd  -0x48(%rbp),%xmm1
movsd  -0x80(%rbp),%xmm2
subsd  0x28(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm3
call   1080 <A_array@plt>
mov    %rax,-0xb0(%rbp)
mov    -0x2c(%rbp),%edi
mov    -0x5c(%rbp),%esi
movsd  -0x88(%rbp),%xmm0
ff
subsd  -0x18(%rbp),%xmm0
movsd  -0x88(%rbp),%xmm1
ff
subsd  -0x50(%rbp),%xmm1
movsd  -0x88(%rbp),%xmm2
ff
subsd  0x30(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm3
call   1080 <A_array@plt>
mov    %rax,-0xb8(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movl   $0x0,-0x60(%rbp)
mov    -0x60(%rbp),%eax
mov    -0x24(%rbp),%ecx
add    -0x54(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1438 <nuclear_attraction+0x2d8>
movl   $0x0,-0x64(%rbp)
mov    -0x64(%rbp),%eax
mov    -0x28(%rbp),%ecx
add    -0x58(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1425 <nuclear_attraction+0x2c5>
movl   $0x0,-0x68(%rbp)
mov    -0x68(%rbp),%eax
mov    -0x2c(%rbp),%ecx
add    -0x5c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jge    1412 <nuclear_attraction+0x2b2>
mov    -0xa8(%rbp),%rax
movslq -0x60(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0xb0(%rbp),%rax
movslq -0x64(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
mov    -0xb8(%rbp),%rax
movslq -0x68(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x60(%rbp),%edi
add    -0x64(%rbp),%edi
add    -0x68(%rbp),%edi
movsd  -0xa0(%rbp),%xmm0
ff
mulsd  -0x70(%rbp),%xmm0
call   1040 <Fgamma@plt>
movaps %xmm0,%xmm2
movsd  -0xc0(%rbp),%xmm0
ff
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x68(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x68(%rbp)
jmp    137a <nuclear_attraction+0x21a>
jmp    1417 <nuclear_attraction+0x2b7>
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    135f <nuclear_attraction+0x1ff>
jmp    142a <nuclear_attraction+0x2ca>
mov    -0x60(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
jmp    1344 <nuclear_attraction+0x1e4>
mov    -0xa8(%rbp),%rdi
call   1030 <free@plt>
mov    -0xb0(%rbp),%rdi
call   1030 <free@plt>
mov    -0xb8(%rbp),%rdi
call   1030 <free@plt>
movsd  -0x20(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  0x10(%rbp),%xmm0
movsd  0xb83(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xb6f(%rip),%xmm1
mulsd  %xmm1,%xmm0
divsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  0x18(%rbp),%xmm0
mulsd  -0x98(%rbp),%xmm0
ff
divsd  -0x70(%rbp),%xmm0
call   1070 <exp@plt>
movaps %xmm0,%xmm1
movsd  -0xc8(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
mulsd  -0x90(%rbp),%xmm0
ff
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<nuclear_attraction>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x98,%rsp
mov    %r9,0x88(%rsp)
mov    %r8d,%r13d
mov    %ecx,%r15d
movsd  %xmm7,0x8(%rsp)
movsd  %xmm6,0x10(%rsp)
movsd  %xmm5,0x18(%rsp)
mov    %edx,%r14d
mov    %esi,%ebp
mov    %edi,%r12d
movsd  %xmm3,0x50(%rsp)
movsd  %xmm2,0x30(%rsp)
movsd  %xmm1,0x28(%rsp)
movaps %xmm0,%xmm1
movsd  %xmm0,0x40(%rsp)
movsd  0xd8(%rsp),%xmm2
movapd %xmm4,0x70(%rsp)
movapd %xmm4,%xmm0
addsd  %xmm2,%xmm0
movapd %xmm0,0x60(%rsp)
movapd %xmm4,%xmm0
movaps %xmm5,%xmm3
call   1050 <product_center_1D@plt>
movsd  %xmm0,0x38(%rsp)
movaps 0x70(%rsp),%xmm0
movsd  0x28(%rsp),%xmm1
movsd  0xd8(%rsp),%xmm2
movsd  0x10(%rsp),%xmm3
call   1050 <product_center_1D@plt>
movsd  %xmm0,0x20(%rsp)
movaps 0x70(%rsp),%xmm0
movsd  0x30(%rsp),%xmm1
movsd  0xd8(%rsp),%xmm2
movsd  0x8(%rsp),%xmm3
call   1050 <product_center_1D@plt>
movsd  %xmm0,0x48(%rsp)
movsd  0x40(%rsp),%xmm0
movsd  0x28(%rsp),%xmm1
movsd  0x30(%rsp),%xmm2
movsd  0x18(%rsp),%xmm3
movsd  0x10(%rsp),%xmm4
movsd  0x8(%rsp),%xmm5
call   1060 <dist2@plt>
movsd  %xmm0,0x90(%rsp)
movsd  0xe0(%rsp),%xmm0
movsd  0xe8(%rsp),%xmm1
movsd  0xf0(%rsp),%xmm2
movsd  0x38(%rsp),%xmm3
movsd  0x20(%rsp),%xmm4
movsd  0x48(%rsp),%xmm5
call   1060 <dist2@plt>
movsd  %xmm0,0x58(%rsp)
movsd  0x38(%rsp),%xmm2
movapd %xmm2,%xmm0
subsd  0x40(%rsp),%xmm0
movapd %xmm2,%xmm1
subsd  0x18(%rsp),%xmm1
subsd  0xe0(%rsp),%xmm2
mov    %r12d,%edi
mov    %r15d,%esi
movaps 0x60(%rsp),%xmm3
call   1080 <A_array@plt>
mov    %rax,0x18(%rsp)
movsd  0x20(%rsp),%xmm2
movapd %xmm2,%xmm0
subsd  0x28(%rsp),%xmm0
movapd %xmm2,%xmm1
subsd  0x10(%rsp),%xmm1
subsd  0xe8(%rsp),%xmm2
mov    %rbp,0x10(%rsp)
mov    %ebp,%edi
mov    %r13,%rbp
mov    %r13d,%esi
movaps 0x60(%rsp),%xmm3
call   1080 <A_array@plt>
mov    %rax,%rbx
movsd  0x48(%rsp),%xmm2
movapd %xmm2,%xmm0
subsd  0x30(%rsp),%xmm0
movapd %xmm2,%xmm1
subsd  0x8(%rsp),%xmm1
subsd  0xf0(%rsp),%xmm2
mov    %r14,%r13
mov    %r14d,%edi
mov    0x88(%rsp),%r14
mov    %r14d,%esi
movaps 0x60(%rsp),%xmm3
call   1080 <A_array@plt>
mov    %rax,0x20(%rsp)
add    %r12d,%r15d
js     147a <nuclear_attraction+0x31a>
mov    0x10(%rsp),%r12
lea    (%r12,%rbp,1),%eax
mov    %eax,0x38(%rsp)
lea    (%r14,%r13,1),%eax
mov    %eax,0x28(%rsp)
movsd  0x58(%rsp),%xmm1
mulsd  0x60(%rsp),%xmm1
lea    (%r14,%r13,1),%eax
add    $0x1,%eax
lea    (%r12,%rbp,1),%ecx
add    $0x1,%ecx
mov    %rcx,0x48(%rsp)
add    $0x1,%r15d
mov    %r15,0x40(%rsp)
xorpd  %xmm0,%xmm0
movsd  %xmm0,0x8(%rsp)
xor    %r13d,%r13d
movapd %xmm1,%xmm0
mov    0x18(%rsp),%rdi
mov    %rbx,0x10(%rsp)
movsd  %xmm1,0x58(%rsp)
mov    0x20(%rsp),%r14
jmp    13d4 <nuclear_attraction+0x274>
nopl   (%rax)
add    $0x1,%r13
cmp    0x40(%rsp),%r13
mov    0x10(%rsp),%rbx
je     1489 <nuclear_attraction+0x329>
cmpl   $0x0,0x38(%rsp)
js     13c0 <nuclear_attraction+0x260>
mov    %r13,%r15
xor    %ebp,%ebp
jmp    140b <nuclear_attraction+0x2ab>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  0x8(%rsp),%xmm1
movsd  %xmm1,0x8(%rsp)
add    $0x1,%rbp
add    $0x1,%r15
cmp    0x48(%rsp),%rbp
je     13c0 <nuclear_attraction+0x260>
cmpl   $0x0,0x28(%rsp)
js     13f0 <nuclear_attraction+0x290>
xor    %ebx,%ebx
movsd  0x8(%rsp),%xmm1
nopw   0x0(%rax,%rax,1)
movsd  %xmm1,0x8(%rsp)
movsd  (%rdi,%r13,8),%xmm0
mov    0x10(%rsp),%rdi
mulsd  (%rdi,%rbp,8),%xmm0
mulsd  (%r14,%rbx,8),%xmm0
movsd  %xmm0,0x30(%rsp)
lea    (%r15,%rbx,1),%edi
movsd  0x58(%rsp),%xmm0
mov    %rax,%r12
call   1040 <Fgamma@plt>
movsd  0x8(%rsp),%xmm1
mov    %r12,%rax
mov    0x18(%rsp),%rdi
mulsd  0x30(%rsp),%xmm0
addsd  %xmm0,%xmm1
add    $0x1,%rbx
cmp    %rbx,%r12
jne    1420 <nuclear_attraction+0x2c0>
jmp    13f6 <nuclear_attraction+0x296>
xorpd  %xmm0,%xmm0
movsd  %xmm0,0x8(%rsp)
mov    0x18(%rsp),%rdi
call   1030 <free@plt>
mov    %rbx,%rdi
call   1030 <free@plt>
mov    0x20(%rsp),%rdi
call   1030 <free@plt>
movsd  0x50(%rsp),%xmm2
mulsd  0xd0(%rsp),%xmm2
addsd  %xmm2,%xmm2
mulsd  0xb45(%rip),%xmm2
movapd 0x70(%rsp),%xmm0
xorpd  0xb47(%rip),%xmm0
movapd 0x60(%rsp),%xmm1
divsd  %xmm1,%xmm2
movsd  %xmm2,0x50(%rsp)
mulsd  0xd8(%rsp),%xmm0
mulsd  0x90(%rsp),%xmm0
divsd  %xmm1,%xmm0
call   1070 <exp@plt>
mulsd  0x50(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
add    $0x98,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define double @nuclear_attraction(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 i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca i32
%33 = alloca i32
%34 = alloca i32
%35 = alloca double
%36 = alloca double
%37 = alloca double
%38 = alloca double
%39 = alloca i32
%40 = alloca i32
%41 = alloca i32
%42 = alloca double
%43 = alloca double
%44 = alloca double
%45 = alloca double
%46 = alloca double
%47 = alloca double
%48 = alloca double
%49 = alloca double*
%50 = alloca double*
%51 = alloca double*
store double %0, double* %20
store double %1, double* %21
store double %2, double* %22
store double %3, double* %23
store i32 %4, i32* %24
store i32 %5, i32* %25
store i32 %6, i32* %26
store double %7, double* %27
store double %8, double* %28
store double %9, double* %29
store double %10, double* %30
store double %11, double* %31
store i32 %12, i32* %32
store i32 %13, i32* %33
store i32 %14, i32* %34
store double %15, double* %35
store double %16, double* %36
store double %17, double* %37
store double %18, double* %38
%52 = load double, double* %27
%53 = load double, double* %35
%54 = fadd double %52, %53
store double %54, double* %42
%55 = load double, double* %27
%56 = load double, double* %20
%57 = load double, double* %35
%58 = load double, double* %28
%59 = call double @product_center_1D(double %55, double %56, double %57, double %58)
store double %59, double* %43
%60 = load double, double* %27
%61 = load double, double* %21
%62 = load double, double* %35
%63 = load double, double* %29
%64 = call double @product_center_1D(double %60, double %61, double %62, double %63)
store double %64, double* %44
%65 = load double, double* %27
%66 = load double, double* %22
%67 = load double, double* %35
%68 = load double, double* %30
%69 = call double @product_center_1D(double %65, double %66, double %67, double %68)
store double %69, double* %45
%70 = load double, double* %20
%71 = load double, double* %21
%72 = load double, double* %22
%73 = load double, double* %28
%74 = load double, double* %29
%75 = load double, double* %30
%76 = call double @dist2(double %70, double %71, double %72, double %73, double %74, double %75)
store double %76, double* %47
%77 = load double, double* %36
%78 = load double, double* %37
%79 = load double, double* %38
%80 = load double, double* %43
%81 = load double, double* %44
%82 = load double, double* %45
%83 = call double @dist2(double %77, double %78, double %79, double %80, double %81, double %82)
store double %83, double* %48
%84 = load i32, i32* %24
%85 = load i32, i32* %32
%86 = load double, double* %43
%87 = load double, double* %20
%88 = fsub double %86, %87
%89 = load double, double* %43
%90 = load double, double* %28
%91 = fsub double %89, %90
%92 = load double, double* %43
%93 = load double, double* %36
%94 = fsub double %92, %93
%95 = load double, double* %42
%96 = call double* @A_array(i32 %84, i32 %85, double %88, double %91, double %94, double %95)
store double* %96, double** %49
%97 = load i32, i32* %25
%98 = load i32, i32* %33
%99 = load double, double* %44
%100 = load double, double* %21
%101 = fsub double %99, %100
%102 = load double, double* %44
%103 = load double, double* %29
%104 = fsub double %102, %103
%105 = load double, double* %44
%106 = load double, double* %37
%107 = fsub double %105, %106
%108 = load double, double* %42
%109 = call double* @A_array(i32 %97, i32 %98, double %101, double %104, double %107, double %108)
store double* %109, double** %50
%110 = load i32, i32* %26
%111 = load i32, i32* %34
%112 = load double, double* %45
%113 = load double, double* %22
%114 = fsub double %112, %113
%115 = load double, double* %45
%116 = load double, double* %30
%117 = fsub double %115, %116
%118 = load double, double* %45
%119 = load double, double* %38
%120 = fsub double %118, %119
%121 = load double, double* %42
%122 = call double* @A_array(i32 %110, i32 %111, double %114, double %117, double %120, double %121)
store double* %122, double** %51
store double 0.000000e+00, double* %46
store i32 0, i32* %39
br label %123
123: ; preds = %183, %19
%124 = load i32, i32* %39
%125 = load i32, i32* %24
%126 = load i32, i32* %32
%127 = add nsw i32 %125, %126
%128 = add nsw i32 %127, 1
%129 = icmp slt i32 %124, %128
br i1 %129, label %130, label %186
130: ; preds = %123
store i32 0, i32* %40
br label %131
131: ; preds = %179, %130
%132 = load i32, i32* %40
%133 = load i32, i32* %25
%134 = load i32, i32* %33
%135 = add nsw i32 %133, %134
%136 = add nsw i32 %135, 1
%137 = icmp slt i32 %132, %136
br i1 %137, label %138, label %182
138: ; preds = %131
store i32 0, i32* %41
br label %139
139: ; preds = %175, %138
%140 = load i32, i32* %41
%141 = load i32, i32* %26
%142 = load i32, i32* %34
%143 = add nsw i32 %141, %142
%144 = add nsw i32 %143, 1
%145 = icmp slt i32 %140, %144
br i1 %145, label %146, label %178
146: ; preds = %139
%147 = load double*, double** %49
%148 = load i32, i32* %39
%149 = sext i32 %148 to i64
%150 = getelementptr inbounds double, double* %147, i64 %149
%151 = load double, double* %150
%152 = load double*, double** %50
%153 = load i32, i32* %40
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds double, double* %152, i64 %154
%156 = load double, double* %155
%157 = fmul double %151, %156
%158 = load double*, double** %51
%159 = load i32, i32* %41
%160 = sext i32 %159 to i64
%161 = getelementptr inbounds double, double* %158, i64 %160
%162 = load double, double* %161
%163 = fmul double %157, %162
%164 = load i32, i32* %39
%165 = load i32, i32* %40
%166 = add nsw i32 %164, %165
%167 = load i32, i32* %41
%168 = add nsw i32 %166, %167
%169 = load double, double* %48
%170 = load double, double* %42
%171 = fmul double %169, %170
%172 = call double @Fgamma(i32 %168, double %171)
%173 = load double, double* %46
%174 = call double @llvm.fmuladd.f64(double %163, double %172, double %173)
store double %174, double* %46
br label %175
175: ; preds = %146
%176 = load i32, i32* %41
%177 = add nsw i32 %176, 1
store i32 %177, i32* %41
br label %139
178: ; preds = %139
br label %179
179: ; preds = %178
%180 = load i32, i32* %40
%181 = add nsw i32 %180, 1
store i32 %181, i32* %40
br label %131
182: ; preds = %131
br label %183
183: ; preds = %182
%184 = load i32, i32* %39
%185 = add nsw i32 %184, 1
store i32 %185, i32* %39
br label %123
186: ; preds = %123
%187 = load double*, double** %49
%188 = call i32 @free(double* %187)
%189 = load double*, double** %50
%190 = call i32 @free(double* %189)
%191 = load double*, double** %51
%192 = call i32 @free(double* %191)
%193 = load double, double* %23
%194 = fneg double %193
%195 = load double, double* %31
%196 = fmul double %194, %195
%197 = fmul double %196, 2.000000e+00
%198 = fmul double %197, 0x400921FB54442D18
%199 = load double, double* %42
%200 = fdiv double %198, %199
%201 = load double, double* %27
%202 = fneg double %201
%203 = load double, double* %35
%204 = fmul double %202, %203
%205 = load double, double* %47
%206 = fmul double %204, %205
%207 = load double, double* %42
%208 = fdiv double %206, %207
%209 = call double @exp(double %208)
%210 = fmul double %200, %209
%211 = load double, double* %46
%212 = fmul double %210, %211
ret double %212
}

LLVM IR (-O2):
define double @nuclear_attraction(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 = fadd double %7, %15
%21 = tail call double @product_center_1D(double %7, double %0, double %15, double %8)
%22 = tail call double @product_center_1D(double %7, double %1, double %15, double %9)
%23 = tail call double @product_center_1D(double %7, double %2, double %15, double %10)
%24 = tail call double @dist2(double %0, double %1, double %2, double %8, double %9, double %10)
%25 = tail call double @dist2(double %16, double %17, double %18, double %21, double %22, double %23)
%26 = fsub double %21, %0
%27 = fsub double %21, %8
%28 = fsub double %21, %16
%29 = tail call double* @A_array(i32 %4, i32 %12, double %26, double %27, double %28, double %20)
%30 = fsub double %22, %1
%31 = fsub double %22, %9
%32 = fsub double %22, %17
%33 = tail call double* @A_array(i32 %5, i32 %13, double %30, double %31, double %32, double %20)
%34 = fsub double %23, %2
%35 = fsub double %23, %10
%36 = fsub double %23, %18
%37 = tail call double* @A_array(i32 %6, i32 %14, double %34, double %35, double %36, double %20)
%38 = add i32 %12, %4
%39 = icmp slt i32 %38, 0
br i1 %39, label %86, label %40
40: ; preds = %19
%41 = add i32 %13, %5
%42 = icmp slt i32 %41, 0
%43 = add i32 %14, %6
%44 = icmp slt i32 %43, 0
%45 = fmul double %20, %25
%46 = add i32 %43, 1
%47 = add i32 %41, 1
%48 = add nuw i32 %38, 1
%49 = zext i32 %48 to i64
%50 = zext i32 %47 to i64
%51 = zext i32 %46 to i64
br label %52
52: ; preds = %40, %82
%53 = phi i64 [ 0, %40 ], [ %84, %82 ]
%54 = phi double [ 0.000000e+00, %40 ], [ %83, %82 ]
br i1 %42, label %82, label %55
55: ; preds = %52
%56 = getelementptr inbounds double, double* %29, i64 %53
br label %57
57: ; preds = %55, %78
%58 = phi i64 [ 0, %55 ], [ %80, %78 ]
%59 = phi double [ %54, %55 ], [ %79, %78 ]
br i1 %44, label %78, label %60
60: ; preds = %57
%61 = getelementptr inbounds double, double* %33, i64 %58
%62 = add nuw nsw i64 %58, %53
br label %63
63: ; preds = %60, %63
%64 = phi i64 [ 0, %60 ], [ %76, %63 ]
%65 = phi double [ %59, %60 ], [ %75, %63 ]
%66 = load double, double* %56
%67 = load double, double* %61
%68 = fmul double %66, %67
%69 = getelementptr inbounds double, double* %37, i64 %64
%70 = load double, double* %69
%71 = fmul double %68, %70
%72 = add nuw nsw i64 %62, %64
%73 = trunc i64 %72 to i32
%74 = tail call double @Fgamma(i32 %73, double %45)
%75 = tail call double @llvm.fmuladd.f64(double %71, double %74, double %65)
%76 = add nuw nsw i64 %64, 1
%77 = icmp eq i64 %76, %51
br i1 %77, label %78, label %63
78: ; preds = %63, %57
%79 = phi double [ %59, %57 ], [ %75, %63 ]
%80 = add nuw nsw i64 %58, 1
%81 = icmp eq i64 %80, %50
br i1 %81, label %82, label %57
82: ; preds = %78, %52
%83 = phi double [ %54, %52 ], [ %79, %78 ]
%84 = add nuw nsw i64 %53, 1
%85 = icmp eq i64 %84, %49
br i1 %85, label %86, label %52
86: ; preds = %82, %19
%87 = phi double [ 0.000000e+00, %19 ], [ %83, %82 ]
%88 = tail call i32 @free(double* %29)
%89 = tail call i32 @free(double* %33)
%90 = tail call i32 @free(double* %37)
%91 = fneg double %3
%92 = fmul double %91, %11
%93 = fmul double %92, 2.000000e+00
%94 = fmul double %93, 0x400921FB54442D18
%95 = fdiv double %94, %20
%96 = fneg double %7
%97 = fmul double %96, %15
%98 = fmul double %97, %24
%99 = fdiv double %98, %20
%100 = tail call double @exp(double %99)
%101 = fmul double %95, %100
%102 = fmul double %87, %101
ret double %102
}