#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 */
float M_PI;
float exp(float);
float moment_1d(int, int, int, float, float, float, float);
float sqrt(float);
float moment(float alpha1, int l1, int m1, int n1, float xa, float ya, float za,
             float alpha2, int l2, int m2, int n2, float xb, float yb, float zb,
             int mx, int my, int mz, float xc, float yc, float zc) {
  float rab2, eta, xp, yp, zp, pre, wx, wy, wz;
  rab2 =
      ((xa - xb) * (xa - xb) + (ya - yb) * (ya - yb) + (za - zb) * (za - zb));
  eta = 1.0 / (alpha1 + alpha2);
  xp = (alpha1 * xa + alpha2 * xb) * eta;
  yp = (alpha1 * ya + alpha2 * yb) * eta;
  zp = (alpha1 * za + alpha2 * zb) * eta;
  wx = moment_1d(l1, l2, mx, xp - xa, xp - xb, xp - xc, eta);
  wy = moment_1d(m1, m2, my, yp - ya, yp - yb, yp - yc, eta);
  wz = moment_1d(n1, n2, mz, zp - za, zp - zb, zp - zc, eta);
  pre = M_PI * eta * sqrt(M_PI * eta) * exp(-alpha1 * alpha2 * rab2 * eta);
  return pre * wx * wy * wz;
}


x86 assembly (clang, -O0):
<moment>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
movss  0x38(%rbp),%xmm8
movss  0x30(%rbp),%xmm8
movss  0x28(%rbp),%xmm8
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
movss  %xmm0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movss  %xmm1,-0x14(%rbp)
movss  %xmm2,-0x18(%rbp)
movss  %xmm3,-0x1c(%rbp)
movss  %xmm4,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8d,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movss  %xmm5,-0x30(%rbp)
movss  %xmm6,-0x34(%rbp)
movss  %xmm7,-0x38(%rbp)
movss  -0x14(%rbp),%xmm1
subss  -0x30(%rbp),%xmm1
movss  -0x14(%rbp),%xmm2
subss  -0x30(%rbp),%xmm2
movss  -0x18(%rbp),%xmm0
subss  -0x34(%rbp),%xmm0
movss  -0x18(%rbp),%xmm3
subss  -0x34(%rbp),%xmm3
mulss  %xmm3,%xmm0
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0x1c(%rbp),%xmm0
subss  -0x38(%rbp),%xmm0
movss  -0x1c(%rbp),%xmm2
subss  -0x38(%rbp),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x4(%rbp),%xmm0
addss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe06(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x4(%rbp),%xmm0
movss  -0x14(%rbp),%xmm2
movss  -0x20(%rbp),%xmm1
mulss  -0x30(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x4(%rbp),%xmm0
movss  -0x18(%rbp),%xmm2
movss  -0x20(%rbp),%xmm1
mulss  -0x34(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x4(%rbp),%xmm0
movss  -0x1c(%rbp),%xmm2
movss  -0x20(%rbp),%xmm1
mulss  -0x38(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
mov    -0x8(%rbp),%edi
mov    -0x24(%rbp),%esi
mov    0x10(%rbp),%edx
movss  -0x44(%rbp),%xmm0
subss  -0x14(%rbp),%xmm0
movss  -0x44(%rbp),%xmm1
subss  -0x30(%rbp),%xmm1
movss  -0x44(%rbp),%xmm2
subss  0x28(%rbp),%xmm2
movss  -0x40(%rbp),%xmm3
call   1040 <moment_1d@plt>
movss  %xmm0,-0x54(%rbp)
mov    -0xc(%rbp),%edi
mov    -0x28(%rbp),%esi
mov    0x18(%rbp),%edx
movss  -0x48(%rbp),%xmm0
subss  -0x18(%rbp),%xmm0
movss  -0x48(%rbp),%xmm1
subss  -0x34(%rbp),%xmm1
movss  -0x48(%rbp),%xmm2
subss  0x30(%rbp),%xmm2
movss  -0x40(%rbp),%xmm3
call   1040 <moment_1d@plt>
movss  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%edi
mov    -0x2c(%rbp),%esi
mov    0x20(%rbp),%edx
movss  -0x4c(%rbp),%xmm0
subss  -0x1c(%rbp),%xmm0
movss  -0x4c(%rbp),%xmm1
subss  -0x38(%rbp),%xmm1
movss  -0x4c(%rbp),%xmm2
subss  0x38(%rbp),%xmm2
movss  -0x40(%rbp),%xmm3
call   1040 <moment_1d@plt>
movss  %xmm0,-0x5c(%rbp)
mov    0x2cc6(%rip),%rax
movss  (%rax),%xmm0
mulss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x64(%rbp)
mov    0x2cb1(%rip),%rax
movss  (%rax),%xmm0
mulss  -0x40(%rbp),%xmm0
call   1050 <sqrt@plt>
movaps %xmm0,%xmm1
movss  -0x64(%rbp),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,-0x60(%rbp)
movss  -0x4(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  -0x20(%rbp),%xmm0
mulss  -0x3c(%rbp),%xmm0
mulss  -0x40(%rbp),%xmm0
call   1030 <exp@plt>
movaps %xmm0,%xmm1
movss  -0x60(%rbp),%xmm0
mulss  %xmm1,%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x50(%rbp),%xmm0
mulss  -0x54(%rbp),%xmm0
mulss  -0x58(%rbp),%xmm0
mulss  -0x5c(%rbp),%xmm0
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<moment>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %r9d,%r15d
mov    %r8d,%ebx
movaps %xmm2,%xmm9
mov    %edx,%r12d
mov    %esi,%ebp
movaps %xmm0,%xmm8
mov    0xa0(%rsp),%r14d
mov    0x98(%rsp),%r13d
mov    0x90(%rsp),%edx
addss  %xmm4,%xmm0
movss  0xe8b(%rip),%xmm10
divss  %xmm0,%xmm10
movaps %xmm4,%xmm0
mulss  %xmm5,%xmm0
movaps %xmm8,%xmm2
mulss  %xmm1,%xmm2
addss  %xmm0,%xmm2
mulss  %xmm10,%xmm2
movaps %xmm2,%xmm0
subss  %xmm1,%xmm0
subss  %xmm5,%xmm1
movaps %xmm9,%xmm11
movss  %xmm9,0x10(%rsp)
movss  %xmm6,0xc(%rsp)
subss  %xmm6,%xmm9
mulss  %xmm9,%xmm9
mulss  %xmm1,%xmm1
addss  %xmm9,%xmm1
movaps %xmm3,%xmm9
movss  %xmm3,0x8(%rsp)
movss  %xmm7,(%rsp)
subss  %xmm7,%xmm3
mulss  %xmm3,%xmm3
addss  %xmm1,%xmm3
movss  %xmm3,0x18(%rsp)
movaps %xmm4,%xmm1
mulss  %xmm6,%xmm1
movaps %xmm8,%xmm6
mulss  %xmm11,%xmm6
addss  %xmm1,%xmm6
movaps %xmm10,%xmm3
movss  %xmm10,0x4(%rsp)
mulss  %xmm10,%xmm6
movaps %xmm6,0x20(%rsp)
movss  %xmm4,0x1c(%rsp)
movaps %xmm4,%xmm1
mulss  %xmm7,%xmm1
movaps %xmm8,0x40(%rsp)
mulss  %xmm9,%xmm8
addss  %xmm1,%xmm8
mulss  %xmm10,%xmm8
movaps %xmm8,0x30(%rsp)
movaps %xmm2,%xmm1
subss  %xmm5,%xmm1
subss  0xa8(%rsp),%xmm2
mov    %ecx,%esi
call   1040 <moment_1d@plt>
movss  %xmm0,0x14(%rsp)
movaps 0x20(%rsp),%xmm2
movaps %xmm2,%xmm0
subss  0x10(%rsp),%xmm0
movaps %xmm2,%xmm1
subss  0xc(%rsp),%xmm1
subss  0xb0(%rsp),%xmm2
mov    %ebp,%edi
mov    %ebx,%esi
mov    %r13d,%edx
movss  0x4(%rsp),%xmm3
call   1040 <moment_1d@plt>
movss  %xmm0,0xc(%rsp)
movaps 0x30(%rsp),%xmm2
movaps %xmm2,%xmm0
subss  0x8(%rsp),%xmm0
movaps %xmm2,%xmm1
subss  (%rsp),%xmm1
subss  0xb8(%rsp),%xmm2
mov    %r12d,%edi
mov    %r15d,%esi
mov    %r14d,%edx
movss  0x4(%rsp),%xmm3
call   1040 <moment_1d@plt>
movss  %xmm0,0x8(%rsp)
mov    0x2d20(%rip),%rax
movss  (%rax),%xmm0
mulss  0x4(%rsp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
movss  %xmm0,(%rsp)
jb     12e5 <moment+0x1b5>
sqrtss %xmm0,%xmm0
jmp    12ea <moment+0x1ba>
call   1050 <sqrt@plt>
movaps 0x40(%rsp),%xmm1
xorps  0xd1a(%rip),%xmm1
movss  (%rsp),%xmm2
mulss  %xmm0,%xmm2
movss  %xmm2,(%rsp)
mulss  0x1c(%rsp),%xmm1
mulss  0x18(%rsp),%xmm1
movss  0x4(%rsp),%xmm0
mulss  %xmm1,%xmm0
call   1030 <exp@plt>
mulss  (%rsp),%xmm0
mulss  0x14(%rsp),%xmm0
mulss  0xc(%rsp),%xmm0
mulss  0x8(%rsp),%xmm0
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@M_PI = global float 0.000000e+00
define float @moment(float %0, i32 %1, i32 %2, i32 %3, float %4, float %5, float %6, float %7, i32 %8, i32 %9, i32 %10, float %11, float %12, float %13, i32 %14, i32 %15, i32 %16, float %17, float %18, float %19) {
%21 = fsub float %4, %11
%22 = fsub float %5, %12
%23 = fmul float %22, %22
%24 = tail call float @llvm.fmuladd.f32(float %21, float %21, float %23)
%25 = fsub float %6, %13
%26 = tail call float @llvm.fmuladd.f32(float %25, float %25, float %24)
%27 = fadd float %0, %7
%28 = fdiv float 1.000000e+00, %27
%29 = fmul float %7, %11
%30 = tail call float @llvm.fmuladd.f32(float %0, float %4, float %29)
%31 = fmul float %28, %30
%32 = fmul float %7, %12
%33 = tail call float @llvm.fmuladd.f32(float %0, float %5, float %32)
%34 = fmul float %28, %33
%35 = fmul float %7, %13
%36 = tail call float @llvm.fmuladd.f32(float %0, float %6, float %35)
%37 = fmul float %28, %36
%38 = fsub float %31, %4
%39 = fsub float %31, %11
%40 = fsub float %31, %17
%41 = tail call float @moment_1d(i32 %1, i32 %8, i32 %14, float %38, float %39, float %40, float %28)
%42 = fsub float %34, %5
%43 = fsub float %34, %12
%44 = fsub float %34, %18
%45 = tail call float @moment_1d(i32 %2, i32 %9, i32 %15, float %42, float %43, float %44, float %28)
%46 = fsub float %37, %6
%47 = fsub float %37, %13
%48 = fsub float %37, %19
%49 = tail call float @moment_1d(i32 %3, i32 %10, i32 %16, float %46, float %47, float %48, float %28)
%50 = load float, float* @M_PI
%51 = fmul float %28, %50
%52 = tail call float @sqrt(float %51)
%53 = fmul float %51, %52
%54 = fneg float %0
%55 = fmul float %54, %7
%56 = fmul float %55, %26
%57 = fmul float %28, %56
%58 = tail call float @exp(float %57)
%59 = fmul float %53, %58
%60 = fmul float %41, %59
%61 = fmul float %45, %60
%62 = fmul float %49, %61
ret float %62
}