double evaluateGTRGAMMAINVAR(int *ex1, int *ex2, int *wptr, int *iptr,
                             double *x1_start, double *x2_start, double *EIGN,
                             double *gammaRates, double *tipVector,
                             double *tFreqs, double invariants, double pz,
                             char *tipX1, int lower, int n) {
  int i;
  double *diagptable, *x1, *x2;
  double freqs[4], scaler = 0.25 * (1.0 - invariants), sum = 0.0, z, lz, term,
                   ki;
  freqs[0] = tFreqs[0] * invariants;
  freqs[1] = tFreqs[1] * invariants;
  freqs[2] = tFreqs[2] * invariants;
  freqs[3] = tFreqs[3] * invariants;
  z = pz;
  if (z < 1.0E-15)
    z = 1.0E-15;
  lz = log(z);
  diagptable = (double *)malloc(sizeof(double) * 16);
  for (i = 0; i < 4; i++) {
    ki = gammaRates[i];
    diagptable[i * 4] = 1.0;
    diagptable[i * 4 + 1] = exp(EIGN[0] * ki * lz);
    diagptable[i * 4 + 2] = exp(EIGN[1] * ki * lz);
    diagptable[i * 4 + 3] = exp(EIGN[2] * ki * lz);
  }
  if (tipX1) {
    for (i = lower; i < n; i++) {
      x1 = &(tipVector[4 * tipX1[i]]);
      x2 = &x2_start[16 * i];
      term = x1[0] * x2[0] * diagptable[0];
      term += x1[1] * x2[1] * diagptable[1];
      term += x1[2] * x2[2] * diagptable[2];
      term += x1[3] * x2[3] * diagptable[3];
      term += x1[0] * x2[4] * diagptable[4];
      term += x1[1] * x2[5] * diagptable[5];
      term += x1[2] * x2[6] * diagptable[6];
      term += x1[3] * x2[7] * diagptable[7];
      term += x1[0] * x2[8] * diagptable[8];
      term += x1[1] * x2[9] * diagptable[9];
      term += x1[2] * x2[10] * diagptable[10];
      term += x1[3] * x2[11] * diagptable[11];
      term += x1[0] * x2[12] * diagptable[12];
      term += x1[1] * x2[13] * diagptable[13];
      term += x1[2] * x2[14] * diagptable[14];
      term += x1[3] * x2[15] * diagptable[15];
      if (iptr[i] < 4)
        term = log(
            ((scaler * term) + freqs[iptr[i]]) *
            pow((1.0 /
                 115792089237316195423570985008687907853269984665640564039457584007913129639936.0),
                ex2[i]));
      else
        term =
            log(scaler * term) +
            (ex2[i] *
             log((
                 1.0 /
                 115792089237316195423570985008687907853269984665640564039457584007913129639936.0)));
      sum += wptr[i] * term;
    }
    free(diagptable);
    return sum;
  } else {
    for (i = lower; i < n; i++) {
      x1 = &x1_start[16 * i];
      x2 = &x2_start[16 * i];
      term = x1[0] * x2[0] * diagptable[0];
      term += x1[1] * x2[1] * diagptable[1];
      term += x1[2] * x2[2] * diagptable[2];
      term += x1[3] * x2[3] * diagptable[3];
      term += x1[4] * x2[4] * diagptable[4];
      term += x1[5] * x2[5] * diagptable[5];
      term += x1[6] * x2[6] * diagptable[6];
      term += x1[7] * x2[7] * diagptable[7];
      term += x1[8] * x2[8] * diagptable[8];
      term += x1[9] * x2[9] * diagptable[9];
      term += x1[10] * x2[10] * diagptable[10];
      term += x1[11] * x2[11] * diagptable[11];
      term += x1[12] * x2[12] * diagptable[12];
      term += x1[13] * x2[13] * diagptable[13];
      term += x1[14] * x2[14] * diagptable[14];
      term += x1[15] * x2[15] * diagptable[15];
      if (iptr[i] < 4)
        term = log(
            ((scaler * term) + freqs[iptr[i]]) *
            pow((1.0 /
                 115792089237316195423570985008687907853269984665640564039457584007913129639936.0),
                ex2[i] + ex1[i]));
      else
        term =
            log(scaler * term) +
            ((ex1[i] + ex2[i]) *
             log((
                 1.0 /
                 115792089237316195423570985008687907853269984665640564039457584007913129639936.0)));
      sum += wptr[i] * term;
    }
    free(diagptable);
    return sum;
  }
}


x86 assembly (clang, -O0):
<evaluateGTRGAMMAINVAR>:
push   %rbp
mov    %rsp,%rbp
sub    $0xf0,%rsp
mov    0x40(%rbp),%eax
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%rax
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
movsd  %xmm0,-0x40(%rbp)
movsd  %xmm1,-0x48(%rbp)
movsd  0xe71(%rip),%xmm1
subsd  -0x40(%rbp),%xmm1
movsd  0xe5c(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    0x28(%rbp),%rax
movsd  (%rax),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  0xdd7(%rip),%xmm0
ucomisd -0xa8(%rbp),%xmm0
ff
jbe    1247 <evaluateGTRGAMMAINVAR+0xf7>
movsd  0xdc1(%rip),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  -0xa8(%rbp),%xmm0
ff
call   1060 <log@plt>
movsd  %xmm0,-0xb0(%rbp)
ff
mov    $0x80,%edi
call   1040 <malloc@plt>
mov    %rax,-0x58(%rbp)
movl   $0x0,-0x4c(%rbp)
cmpl   $0x4,-0x4c(%rbp)
jge    1350 <evaluateGTRGAMMAINVAR+0x200>
mov    0x18(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x58(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
movsd  0xd6b(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
mulsd  -0xc0(%rbp),%xmm0
ff
mulsd  -0xb0(%rbp),%xmm0
ff
call   1050 <exp@plt>
mov    -0x58(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x2,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mulsd  -0xc0(%rbp),%xmm0
ff
mulsd  -0xb0(%rbp),%xmm0
ff
call   1050 <exp@plt>
mov    -0x58(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x2,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
mulsd  -0xc0(%rbp),%xmm0
ff
mulsd  -0xb0(%rbp),%xmm0
ff
call   1050 <exp@plt>
mov    -0x58(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x2,%ecx
add    $0x3,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1271 <evaluateGTRGAMMAINVAR+0x121>
cmpq   $0x0,0x30(%rbp)
je     17fa <evaluateGTRGAMMAINVAR+0x6aa>
mov    0x38(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    0x40(%rbp),%eax
jge    17df <evaluateGTRGAMMAINVAR+0x68f>
mov    0x20(%rbp),%rax
mov    0x30(%rbp),%rcx
movslq -0x4c(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x4,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mulsd  (%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x8(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x10(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x18(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x18(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x20(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x20(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x28(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x28(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x30(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x30(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x38(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x38(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x40(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x40(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x48(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x48(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x50(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x50(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x58(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x58(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x60(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x60(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x68(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x68(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x70(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x70(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x78(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x78(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cmpl   $0x4,(%rax,%rcx,4)
jge    1742 <evaluateGTRGAMMAINVAR+0x5f2>
movsd  -0x98(%rbp),%xmm0
ff
movsd  -0xb8(%rbp),%xmm2
ff
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movslq (%rax,%rcx,4),%rax
movsd  -0x90(%rbp,%rax,8),%xmm1
ff ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x18(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm1
movsd  0x8fc(%rip),%xmm0
call   1070 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0xc8(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
call   1060 <log@plt>
movsd  %xmm0,-0xb8(%rbp)
ff
jmp    17a4 <evaluateGTRGAMMAINVAR+0x654>
movsd  -0x98(%rbp),%xmm0
ff
mulsd  -0xb8(%rbp),%xmm0
ff
call   1060 <log@plt>
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x18(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
movsd  0x89c(%rip),%xmm0
call   1060 <log@plt>
movsd  -0xd8(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0xd0(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm0
movsd  -0xb8(%rbp),%xmm2
ff
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1361 <evaluateGTRGAMMAINVAR+0x211>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
movsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
jmp    1ca8 <evaluateGTRGAMMAINVAR+0xb58>
mov    0x38(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    0x40(%rbp),%eax
jge    1c92 <evaluateGTRGAMMAINVAR+0xb42>
mov    -0x30(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x4,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x4c(%rbp),%ecx
shl    $0x4,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x60(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  (%rax),%xmm0
mov    -0x58(%rbp),%rax
mulsd  (%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x8(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x8(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x10(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x10(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x10(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x18(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x18(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x18(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x20(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x20(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x20(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x28(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x28(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x28(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x30(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x30(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x30(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x38(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x38(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x38(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x40(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x40(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x40(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x48(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x48(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x48(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x50(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x50(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x50(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x58(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x58(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x58(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x60(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x60(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x60(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x68(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x68(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x68(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x70(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x70(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x70(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movsd  0x78(%rax),%xmm0
mov    -0x68(%rbp),%rax
mulsd  0x78(%rax),%xmm0
mov    -0x58(%rbp),%rax
movsd  0x78(%rax),%xmm2
movsd  -0xb8(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cmpl   $0x4,(%rax,%rcx,4)
jge    1be8 <evaluateGTRGAMMAINVAR+0xa98>
movsd  -0x98(%rbp),%xmm0
ff
movsd  -0xb8(%rbp),%xmm2
ff
mov    -0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movslq (%rax,%rcx,4),%rax
movsd  -0x90(%rbp,%rax,8),%xmm1
ff ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x18(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x10(%rbp),%rcx
movslq -0x4c(%rbp),%rdx
add    (%rcx,%rdx,4),%eax
cvtsi2sd %eax,%xmm1
movsd  0x456(%rip),%xmm0
call   1070 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0xe0(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
call   1060 <log@plt>
movsd  %xmm0,-0xb8(%rbp)
ff
jmp    1c57 <evaluateGTRGAMMAINVAR+0xb07>
movsd  -0x98(%rbp),%xmm0
ff
mulsd  -0xb8(%rbp),%xmm0
ff
call   1060 <log@plt>
movsd  %xmm0,-0xf0(%rbp)
ff
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    -0x18(%rbp),%rcx
movslq -0x4c(%rbp),%rdx
add    (%rcx,%rdx,4),%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
movsd  0x3e9(%rip),%xmm0
call   1060 <log@plt>
movsd  -0xf0(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0xe8(%rbp),%xmm0
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cvtsi2sdl (%rax,%rcx,4),%xmm0
movsd  -0xb8(%rbp),%xmm2
ff
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1800 <evaluateGTRGAMMAINVAR+0x6b0>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
movsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0xf0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<evaluateGTRGAMMAINVAR>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xc8,%rsp
mov    %r9,%rbx
mov    %r8,%rbp
mov    %rcx,0x98(%rsp)
mov    %rdx,0x90(%rsp)
mov    %rsi,0x48(%rsp)
mov    %rdi,0x38(%rsp)
mov    0x128(%rsp),%r14d
mov    0x100(%rsp),%r15
mov    0x108(%rsp),%r12
mov    0x118(%rsp),%rax
movsd  0xe57(%rip),%xmm2
subsd  %xmm0,%xmm2
movsd  %xmm2,0x18(%rsp)
movupd (%rax),%xmm2
unpcklpd %xmm0,%xmm0
mulpd  %xmm0,%xmm2
movapd %xmm2,0xa0(%rsp)
movupd 0x10(%rax),%xmm2
mulpd  %xmm0,%xmm2
movapd %xmm2,0xb0(%rsp)
movsd  0xe26(%rip),%xmm0
maxsd  %xmm1,%xmm0
call   1060 <log@plt>
movsd  %xmm0,0x8(%rsp)
mov    $0x80,%edi
call   1040 <malloc@plt>
mov    %rax,%r13
movsd  (%r12),%xmm1
movsd  %xmm1,0x30(%rsp)
movabs $0x3ff0000000000000,%r12
mov    %r12,(%rax)
movsd  (%r15),%xmm0
mulsd  %xmm1,%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x40(%rsp)
movsd  %xmm0,0x8(%r13)
movsd  0x8(%r15),%xmm0
mulsd  0x30(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x88(%rsp)
movsd  %xmm0,0x10(%r13)
movsd  0x30(%rsp),%xmm0
mulsd  0x10(%r15),%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x30(%rsp)
movsd  %xmm0,0x18(%r13)
mov    0x108(%rsp),%rax
movsd  0x8(%rax),%xmm1
movsd  %xmm1,0x28(%rsp)
mov    %r12,0x20(%r13)
movsd  (%r15),%xmm0
mulsd  %xmm1,%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x80(%rsp)
movsd  %xmm0,0x28(%r13)
movsd  0x8(%r15),%xmm0
mulsd  0x28(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x78(%rsp)
movsd  %xmm0,0x30(%r13)
movsd  0x28(%rsp),%xmm0
mulsd  0x10(%r15),%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x28(%rsp)
movsd  %xmm0,0x38(%r13)
mov    0x108(%rsp),%rax
movsd  0x10(%rax),%xmm1
movsd  %xmm1,0x20(%rsp)
mov    %r12,0x40(%r13)
movsd  (%r15),%xmm0
mulsd  %xmm1,%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x70(%rsp)
movsd  %xmm0,0x48(%r13)
movsd  0x8(%r15),%xmm0
mulsd  0x20(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x68(%rsp)
movsd  %xmm0,0x50(%r13)
movsd  0x20(%rsp),%xmm0
mulsd  0x10(%r15),%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x20(%rsp)
movsd  %xmm0,0x58(%r13)
mov    0x108(%rsp),%rax
movsd  0x18(%rax),%xmm1
movsd  %xmm1,0x10(%rsp)
mov    %r12,0x60(%r13)
movsd  (%r15),%xmm0
mulsd  %xmm1,%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x60(%rsp)
movsd  %xmm0,0x68(%r13)
movsd  0x8(%r15),%xmm0
mulsd  0x10(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x58(%rsp)
movsd  %xmm0,0x70(%r13)
movsd  0x10(%rsp),%xmm0
mulsd  0x10(%r15),%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <exp@plt>
movsd  %xmm0,0x10(%rsp)
movsd  %xmm0,0x78(%r13)
movsd  0x18(%rsp),%xmm0
mulsd  0xc08(%rip),%xmm0
movsd  %xmm0,0x18(%rsp)
xorpd  %xmm3,%xmm3
mov    0x130(%rsp),%eax
cmpq   $0x0,0x120(%rsp)
je     1660 <evaluateGTRGAMMAINVAR+0x510>
cmp    %eax,%r14d
jge    18cb <evaluateGTRGAMMAINVAR+0x77b>
mov    0x110(%rsp),%r15
movslq %r14d,%rbp
movslq %eax,%r12
movsd  0x0(%r13),%xmm0
movsd  %xmm0,0x38(%rsp)
shl    $0x4,%r14d
xorpd  %xmm3,%xmm3
jmp    14b7 <evaluateGTRGAMMAINVAR+0x367>
cs nopw 0x0(%rax,%rax,1)
nop
mulsd  0x18(%rsp),%xmm0
call   1060 <log@plt>
movapd %xmm0,%xmm1
mov    0x48(%rsp),%rax
xorps  %xmm0,%xmm0
cvtsi2sdl (%rax,%rbp,4),%xmm0
mulsd  0xb94(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    0x90(%rsp),%rax
xorps  %xmm1,%xmm1
cvtsi2sdl (%rax,%rbp,4),%xmm1
mulsd  %xmm0,%xmm1
movsd  0x8(%rsp),%xmm3
addsd  %xmm1,%xmm3
add    $0x1,%rbp
add    $0x10,%r14d
cmp    %rbp,%r12
je     18cb <evaluateGTRGAMMAINVAR+0x77b>
movsd  %xmm3,0x8(%rsp)
mov    0x120(%rsp),%rax
movsbq (%rax,%rbp,1),%rcx
shl    $0x5,%rcx
movslq %r14d,%rax
movsd  (%r15,%rcx,1),%xmm1
movsd  0x8(%r15,%rcx,1),%xmm5
movsd  (%rbx,%rax,8),%xmm2
mulsd  %xmm1,%xmm2
mulsd  0x38(%rsp),%xmm2
movsd  0x8(%rbx,%rax,8),%xmm3
mulsd  %xmm5,%xmm3
mulsd  0x40(%rsp),%xmm3
addsd  %xmm2,%xmm3
movsd  0x10(%r15,%rcx,1),%xmm2
movsd  0x10(%rbx,%rax,8),%xmm4
mulsd  %xmm2,%xmm4
mulsd  0x88(%rsp),%xmm4
addsd  %xmm3,%xmm4
movsd  0x18(%r15,%rcx,1),%xmm0
movsd  0x18(%rbx,%rax,8),%xmm3
mulsd  %xmm0,%xmm3
mulsd  0x30(%rsp),%xmm3
addsd  %xmm4,%xmm3
movsd  0x20(%rbx,%rax,8),%xmm4
mulsd  %xmm1,%xmm4
addsd  %xmm3,%xmm4
movsd  0x28(%rbx,%rax,8),%xmm3
mulsd  %xmm5,%xmm3
mulsd  0x80(%rsp),%xmm3
addsd  %xmm4,%xmm3
movsd  0x30(%rbx,%rax,8),%xmm4
mulsd  %xmm2,%xmm4
mulsd  0x78(%rsp),%xmm4
addsd  %xmm3,%xmm4
movsd  0x38(%rbx,%rax,8),%xmm3
mulsd  %xmm0,%xmm3
mulsd  0x28(%rsp),%xmm3
addsd  %xmm4,%xmm3
movsd  0x40(%rbx,%rax,8),%xmm4
mulsd  %xmm1,%xmm4
addsd  %xmm3,%xmm4
movsd  0x48(%rbx,%rax,8),%xmm3
mulsd  %xmm5,%xmm3
mulsd  0x70(%rsp),%xmm3
addsd  %xmm4,%xmm3
movsd  0x50(%rbx,%rax,8),%xmm4
mulsd  %xmm2,%xmm4
mulsd  0x68(%rsp),%xmm4
addsd  %xmm3,%xmm4
movsd  0x58(%rbx,%rax,8),%xmm3
mulsd  %xmm0,%xmm3
mulsd  0x20(%rsp),%xmm3
mulsd  0x60(%rbx,%rax,8),%xmm1
addsd  %xmm4,%xmm3
addsd  %xmm3,%xmm1
mulsd  0x68(%rbx,%rax,8),%xmm5
mulsd  0x60(%rsp),%xmm5
addsd  %xmm1,%xmm5
mulsd  0x70(%rbx,%rax,8),%xmm2
mulsd  0x58(%rsp),%xmm2
addsd  %xmm5,%xmm2
mulsd  0x78(%rbx,%rax,8),%xmm0
mulsd  0x10(%rsp),%xmm0
addsd  %xmm2,%xmm0
mov    0x98(%rsp),%rax
movslq (%rax,%rbp,4),%rax
cmp    $0x3,%rax
jg     1460 <evaluateGTRGAMMAINVAR+0x310>
mulsd  0x18(%rsp),%xmm0
addsd  0xa0(%rsp,%rax,8),%xmm0
movsd  %xmm0,0x50(%rsp)
mov    0x48(%rsp),%rax
xorps  %xmm1,%xmm1
cvtsi2sdl (%rax,%rbp,4),%xmm1
movsd  0x9d5(%rip),%xmm0
call   1070 <pow@plt>
mulsd  0x50(%rsp),%xmm0
call   1060 <log@plt>
jmp    1488 <evaluateGTRGAMMAINVAR+0x338>
cmp    %eax,%r14d
jge    18cb <evaluateGTRGAMMAINVAR+0x77b>
movslq %r14d,%r15
movslq %eax,%r12
movsd  0x0(%r13),%xmm0
movsd  %xmm0,0x10(%rsp)
movsd  0x78(%r13),%xmm0
movsd  %xmm0,0x50(%rsp)
shl    $0x4,%r14d
add    $0xffffffffffffffff,%r12
xorpd  %xmm3,%xmm3
movsd  0x40(%rsp),%xmm2
nopl   0x0(%rax)
movslq %r14d,%rax
movsd  0x0(%rbp,%rax,8),%xmm0
movsd  0x8(%rbp,%rax,8),%xmm1
mulsd  (%rbx,%rax,8),%xmm0
mulsd  0x8(%rbx,%rax,8),%xmm1
mulsd  0x10(%rsp),%xmm0
mulsd  %xmm2,%xmm1
addsd  %xmm0,%xmm1
movsd  0x10(%rbp,%rax,8),%xmm0
mulsd  0x10(%rbx,%rax,8),%xmm0
mulsd  0x88(%rsp),%xmm0
addsd  %xmm1,%xmm0
movsd  0x18(%rbp,%rax,8),%xmm1
mulsd  0x18(%rbx,%rax,8),%xmm1
mulsd  0x30(%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  0x20(%rbp,%rax,8),%xmm0
mulsd  0x20(%rbx,%rax,8),%xmm0
addsd  %xmm1,%xmm0
movsd  0x28(%rbp,%rax,8),%xmm1
mulsd  0x28(%rbx,%rax,8),%xmm1
mulsd  0x80(%rsp),%xmm1
movsd  0x30(%rbp,%rax,8),%xmm2
mulsd  0x30(%rbx,%rax,8),%xmm2
addsd  %xmm0,%xmm1
mulsd  0x78(%rsp),%xmm2
addsd  %xmm1,%xmm2
movsd  0x38(%rbp,%rax,8),%xmm0
mulsd  0x38(%rbx,%rax,8),%xmm0
mulsd  0x28(%rsp),%xmm0
addsd  %xmm2,%xmm0
movsd  0x40(%rbp,%rax,8),%xmm1
mulsd  0x40(%rbx,%rax,8),%xmm1
addsd  %xmm0,%xmm1
movsd  0x48(%rbp,%rax,8),%xmm0
mulsd  0x48(%rbx,%rax,8),%xmm0
mulsd  0x70(%rsp),%xmm0
addsd  %xmm1,%xmm0
movsd  0x50(%rbp,%rax,8),%xmm1
mulsd  0x50(%rbx,%rax,8),%xmm1
mulsd  0x68(%rsp),%xmm1
movsd  0x58(%rbp,%rax,8),%xmm2
mulsd  0x58(%rbx,%rax,8),%xmm2
addsd  %xmm0,%xmm1
mulsd  0x20(%rsp),%xmm2
addsd  %xmm1,%xmm2
movsd  0x60(%rbp,%rax,8),%xmm0
mulsd  0x60(%rbx,%rax,8),%xmm0
addsd  %xmm2,%xmm0
movsd  0x68(%rbp,%rax,8),%xmm1
mulsd  0x68(%rbx,%rax,8),%xmm1
mulsd  0x60(%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  0x70(%rbp,%rax,8),%xmm2
mulsd  0x70(%rbx,%rax,8),%xmm2
mulsd  0x58(%rsp),%xmm2
addsd  %xmm1,%xmm2
movsd  0x78(%rbp,%rax,8),%xmm0
mulsd  0x78(%rbx,%rax,8),%xmm0
mulsd  0x50(%rsp),%xmm0
addsd  %xmm2,%xmm0
mov    0x98(%rsp),%rax
movslq (%rax,%r15,4),%rax
cmp    $0x3,%rax
movsd  %xmm3,0x8(%rsp)
jg     1860 <evaluateGTRGAMMAINVAR+0x710>
mulsd  0x18(%rsp),%xmm0
addsd  0xa0(%rsp,%rax,8),%xmm0
movsd  %xmm0,0x40(%rsp)
mov    0x38(%rsp),%rax
mov    (%rax,%r15,4),%eax
mov    0x48(%rsp),%rcx
add    (%rcx,%r15,4),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  0x7e2(%rip),%xmm0
call   1070 <pow@plt>
mulsd  0x40(%rsp),%xmm0
call   1060 <log@plt>
movsd  0x8(%rsp),%xmm3
jmp    189a <evaluateGTRGAMMAINVAR+0x74a>
cs nopw 0x0(%rax,%rax,1)
mulsd  0x18(%rsp),%xmm0
call   1060 <log@plt>
movsd  0x8(%rsp),%xmm3
movapd %xmm0,%xmm1
mov    0x48(%rsp),%rax
mov    (%rax,%r15,4),%eax
mov    0x38(%rsp),%rcx
add    (%rcx,%r15,4),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0x782(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    0x90(%rsp),%rax
xorps  %xmm1,%xmm1
cvtsi2sdl (%rax,%r15,4),%xmm1
mulsd  %xmm0,%xmm1
addsd  %xmm1,%xmm3
cmp    %r15,%r12
je     18cb <evaluateGTRGAMMAINVAR+0x77b>
movsd  0x8(%r13),%xmm2
add    $0x10,%r14d
add    $0x1,%r15
jmp    16a0 <evaluateGTRGAMMAINVAR+0x550>
movsd  %xmm3,0x8(%rsp)
mov    %r13,%rdi
call   1030 <free@plt>
movsd  0x8(%rsp),%xmm0
add    $0xc8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define double @evaluateGTRGAMMAINVAR(i32* %0, i32* %1, i32* %2, i32* %3, double* %4, double* %5, double* %6, double* %7, double* %8, double* %9, double %10, double %11, i8* %12, i32 %13, i32 %14) {
%16 = alloca double
%17 = alloca i32*
%18 = alloca i32*
%19 = alloca i32*
%20 = alloca i32*
%21 = alloca double*
%22 = alloca double*
%23 = alloca double*
%24 = alloca double*
%25 = alloca double*
%26 = alloca double*
%27 = alloca double
%28 = alloca double
%29 = alloca i8*
%30 = alloca i32
%31 = alloca i32
%32 = alloca i32
%33 = alloca double*
%34 = alloca double*
%35 = alloca double*
%36 = alloca [4 x double]
%37 = alloca double
%38 = alloca double
%39 = alloca double
%40 = alloca double
%41 = alloca double
%42 = alloca double
store i32* %0, i32** %17
store i32* %1, i32** %18
store i32* %2, i32** %19
store i32* %3, i32** %20
store double* %4, double** %21
store double* %5, double** %22
store double* %6, double** %23
store double* %7, double** %24
store double* %8, double** %25
store double* %9, double** %26
store double %10, double* %27
store double %11, double* %28
store i8* %12, i8** %29
store i32 %13, i32* %30
store i32 %14, i32* %31
%43 = load double, double* %27
%44 = fsub double 1.000000e+00, %43
%45 = fmul double 2.500000e-01, %44
store double %45, double* %37
store double 0.000000e+00, double* %38
%46 = load double*, double** %26
%47 = getelementptr inbounds double, double* %46, i64 0
%48 = load double, double* %47
%49 = load double, double* %27
%50 = fmul double %48, %49
%51 = getelementptr inbounds [4 x double], [4 x double]* %36, i64 0, i64 0
store double %50, double* %51
%52 = load double*, double** %26
%53 = getelementptr inbounds double, double* %52, i64 1
%54 = load double, double* %53
%55 = load double, double* %27
%56 = fmul double %54, %55
%57 = getelementptr inbounds [4 x double], [4 x double]* %36, i64 0, i64 1
store double %56, double* %57
%58 = load double*, double** %26
%59 = getelementptr inbounds double, double* %58, i64 2
%60 = load double, double* %59
%61 = load double, double* %27
%62 = fmul double %60, %61
%63 = getelementptr inbounds [4 x double], [4 x double]* %36, i64 0, i64 2
store double %62, double* %63
%64 = load double*, double** %26
%65 = getelementptr inbounds double, double* %64, i64 3
%66 = load double, double* %65
%67 = load double, double* %27
%68 = fmul double %66, %67
%69 = getelementptr inbounds [4 x double], [4 x double]* %36, i64 0, i64 3
store double %68, double* %69
%70 = load double, double* %28
store double %70, double* %39
%71 = load double, double* %39
%72 = fcmp olt double %71, 1.000000e-15
br i1 %72, label %73, label %74
73: ; preds = %15
store double 1.000000e-15, double* %39
br label %74
74: ; preds = %73, %15
%75 = load double, double* %39
%76 = call double @log(double %75)
store double %76, double* %40
%77 = call i8* @malloc(i64 128)
%78 = bitcast i8* %77 to double*
store double* %78, double** %33
store i32 0, i32* %32
br label %79
79: ; preds = %135, %74
%80 = load i32, i32* %32
%81 = icmp slt i32 %80, 4
br i1 %81, label %82, label %138
82: ; preds = %79
%83 = load double*, double** %24
%84 = load i32, i32* %32
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds double, double* %83, i64 %85
%87 = load double, double* %86
store double %87, double* %42
%88 = load double*, double** %33
%89 = load i32, i32* %32
%90 = mul nsw i32 %89, 4
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds double, double* %88, i64 %91
store double 1.000000e+00, double* %92
%93 = load double*, double** %23
%94 = getelementptr inbounds double, double* %93, i64 0
%95 = load double, double* %94
%96 = load double, double* %42
%97 = fmul double %95, %96
%98 = load double, double* %40
%99 = fmul double %97, %98
%100 = call double @exp(double %99)
%101 = load double*, double** %33
%102 = load i32, i32* %32
%103 = mul nsw i32 %102, 4
%104 = add nsw i32 %103, 1
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds double, double* %101, i64 %105
store double %100, double* %106
%107 = load double*, double** %23
%108 = getelementptr inbounds double, double* %107, i64 1
%109 = load double, double* %108
%110 = load double, double* %42
%111 = fmul double %109, %110
%112 = load double, double* %40
%113 = fmul double %111, %112
%114 = call double @exp(double %113)
%115 = load double*, double** %33
%116 = load i32, i32* %32
%117 = mul nsw i32 %116, 4
%118 = add nsw i32 %117, 2
%119 = sext i32 %118 to i64
%120 = getelementptr inbounds double, double* %115, i64 %119
store double %114, double* %120
%121 = load double*, double** %23
%122 = getelementptr inbounds double, double* %121, i64 2
%123 = load double, double* %122
%124 = load double, double* %42
%125 = fmul double %123, %124
%126 = load double, double* %40
%127 = fmul double %125, %126
%128 = call double @exp(double %127)
%129 = load double*, double** %33
%130 = load i32, i32* %32
%131 = mul nsw i32 %130, 4
%132 = add nsw i32 %131, 3
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds double, double* %129, i64 %133
store double %128, double* %134
br label %135
135: ; preds = %82
%136 = load i32, i32* %32
%137 = add nsw i32 %136, 1
store i32 %137, i32* %32
br label %79
138: ; preds = %79
%139 = load i8*, i8** %29
%140 = icmp ne i8* %139, null
br i1 %140, label %141, label %411
141: ; preds = %138
%142 = load i32, i32* %30
store i32 %142, i32* %32
br label %143
143: ; preds = %404, %141
%144 = load i32, i32* %32
%145 = load i32, i32* %31
%146 = icmp slt i32 %144, %145
br i1 %146, label %147, label %407
147: ; preds = %143
%148 = load double*, double** %25
%149 = load i8*, i8** %29
%150 = load i32, i32* %32
%151 = sext i32 %150 to i64
%152 = getelementptr inbounds i8, i8* %149, i64 %151
%153 = load i8, i8* %152
%154 = sext i8 %153 to i32
%155 = mul nsw i32 4, %154
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds double, double* %148, i64 %156
store double* %157, double** %34
%158 = load double*, double** %22
%159 = load i32, i32* %32
%160 = mul nsw i32 16, %159
%161 = sext i32 %160 to i64
%162 = getelementptr inbounds double, double* %158, i64 %161
store double* %162, double** %35
%163 = load double*, double** %34
%164 = getelementptr inbounds double, double* %163, i64 0
%165 = load double, double* %164
%166 = load double*, double** %35
%167 = getelementptr inbounds double, double* %166, i64 0
%168 = load double, double* %167
%169 = fmul double %165, %168
%170 = load double*, double** %33
%171 = getelementptr inbounds double, double* %170, i64 0
%172 = load double, double* %171
%173 = fmul double %169, %172
store double %173, double* %41
%174 = load double*, double** %34
%175 = getelementptr inbounds double, double* %174, i64 1
%176 = load double, double* %175
%177 = load double*, double** %35
%178 = getelementptr inbounds double, double* %177, i64 1
%179 = load double, double* %178
%180 = fmul double %176, %179
%181 = load double*, double** %33
%182 = getelementptr inbounds double, double* %181, i64 1
%183 = load double, double* %182
%184 = load double, double* %41
%185 = call double @llvm.fmuladd.f64(double %180, double %183, double %184)
store double %185, double* %41
%186 = load double*, double** %34
%187 = getelementptr inbounds double, double* %186, i64 2
%188 = load double, double* %187
%189 = load double*, double** %35
%190 = getelementptr inbounds double, double* %189, i64 2
%191 = load double, double* %190
%192 = fmul double %188, %191
%193 = load double*, double** %33
%194 = getelementptr inbounds double, double* %193, i64 2
%195 = load double, double* %194
%196 = load double, double* %41
%197 = call double @llvm.fmuladd.f64(double %192, double %195, double %196)
store double %197, double* %41
%198 = load double*, double** %34
%199 = getelementptr inbounds double, double* %198, i64 3
%200 = load double, double* %199
%201 = load double*, double** %35
%202 = getelementptr inbounds double, double* %201, i64 3
%203 = load double, double* %202
%204 = fmul double %200, %203
%205 = load double*, double** %33
%206 = getelementptr inbounds double, double* %205, i64 3
%207 = load double, double* %206
%208 = load double, double* %41
%209 = call double @llvm.fmuladd.f64(double %204, double %207, double %208)
store double %209, double* %41
%210 = load double*, double** %34
%211 = getelementptr inbounds double, double* %210, i64 0
%212 = load double, double* %211
%213 = load double*, double** %35
%214 = getelementptr inbounds double, double* %213, i64 4
%215 = load double, double* %214
%216 = fmul double %212, %215
%217 = load double*, double** %33
%218 = getelementptr inbounds double, double* %217, i64 4
%219 = load double, double* %218
%220 = load double, double* %41
%221 = call double @llvm.fmuladd.f64(double %216, double %219, double %220)
store double %221, double* %41
%222 = load double*, double** %34
%223 = getelementptr inbounds double, double* %222, i64 1
%224 = load double, double* %223
%225 = load double*, double** %35
%226 = getelementptr inbounds double, double* %225, i64 5
%227 = load double, double* %226
%228 = fmul double %224, %227
%229 = load double*, double** %33
%230 = getelementptr inbounds double, double* %229, i64 5
%231 = load double, double* %230
%232 = load double, double* %41
%233 = call double @llvm.fmuladd.f64(double %228, double %231, double %232)
store double %233, double* %41
%234 = load double*, double** %34
%235 = getelementptr inbounds double, double* %234, i64 2
%236 = load double, double* %235
%237 = load double*, double** %35
%238 = getelementptr inbounds double, double* %237, i64 6
%239 = load double, double* %238
%240 = fmul double %236, %239
%241 = load double*, double** %33
%242 = getelementptr inbounds double, double* %241, i64 6
%243 = load double, double* %242
%244 = load double, double* %41
%245 = call double @llvm.fmuladd.f64(double %240, double %243, double %244)
store double %245, double* %41
%246 = load double*, double** %34
%247 = getelementptr inbounds double, double* %246, i64 3
%248 = load double, double* %247
%249 = load double*, double** %35
%250 = getelementptr inbounds double, double* %249, i64 7
%251 = load double, double* %250
%252 = fmul double %248, %251
%253 = load double*, double** %33
%254 = getelementptr inbounds double, double* %253, i64 7
%255 = load double, double* %254
%256 = load double, double* %41
%257 = call double @llvm.fmuladd.f64(double %252, double %255, double %256)
store double %257, double* %41
%258 = load double*, double** %34
%259 = getelementptr inbounds double, double* %258, i64 0
%260 = load double, double* %259
%261 = load double*, double** %35
%262 = getelementptr inbounds double, double* %261, i64 8
%263 = load double, double* %262
%264 = fmul double %260, %263
%265 = load double*, double** %33
%266 = getelementptr inbounds double, double* %265, i64 8
%267 = load double, double* %266
%268 = load double, double* %41
%269 = call double @llvm.fmuladd.f64(double %264, double %267, double %268)
store double %269, double* %41
%270 = load double*, double** %34
%271 = getelementptr inbounds double, double* %270, i64 1
%272 = load double, double* %271
%273 = load double*, double** %35
%274 = getelementptr inbounds double, double* %273, i64 9
%275 = load double, double* %274
%276 = fmul double %272, %275
%277 = load double*, double** %33
%278 = getelementptr inbounds double, double* %277, i64 9
%279 = load double, double* %278
%280 = load double, double* %41
%281 = call double @llvm.fmuladd.f64(double %276, double %279, double %280)
store double %281, double* %41
%282 = load double*, double** %34
%283 = getelementptr inbounds double, double* %282, i64 2
%284 = load double, double* %283
%285 = load double*, double** %35
%286 = getelementptr inbounds double, double* %285, i64 10
%287 = load double, double* %286
%288 = fmul double %284, %287
%289 = load double*, double** %33
%290 = getelementptr inbounds double, double* %289, i64 10
%291 = load double, double* %290
%292 = load double, double* %41
%293 = call double @llvm.fmuladd.f64(double %288, double %291, double %292)
store double %293, double* %41
%294 = load double*, double** %34
%295 = getelementptr inbounds double, double* %294, i64 3
%296 = load double, double* %295
%297 = load double*, double** %35
%298 = getelementptr inbounds double, double* %297, i64 11
%299 = load double, double* %298
%300 = fmul double %296, %299
%301 = load double*, double** %33
%302 = getelementptr inbounds double, double* %301, i64 11
%303 = load double, double* %302
%304 = load double, double* %41
%305 = call double @llvm.fmuladd.f64(double %300, double %303, double %304)
store double %305, double* %41
%306 = load double*, double** %34
%307 = getelementptr inbounds double, double* %306, i64 0
%308 = load double, double* %307
%309 = load double*, double** %35
%310 = getelementptr inbounds double, double* %309, i64 12
%311 = load double, double* %310
%312 = fmul double %308, %311
%313 = load double*, double** %33
%314 = getelementptr inbounds double, double* %313, i64 12
%315 = load double, double* %314
%316 = load double, double* %41
%317 = call double @llvm.fmuladd.f64(double %312, double %315, double %316)
store double %317, double* %41
%318 = load double*, double** %34
%319 = getelementptr inbounds double, double* %318, i64 1
%320 = load double, double* %319
%321 = load double*, double** %35
%322 = getelementptr inbounds double, double* %321, i64 13
%323 = load double, double* %322
%324 = fmul double %320, %323
%325 = load double*, double** %33
%326 = getelementptr inbounds double, double* %325, i64 13
%327 = load double, double* %326
%328 = load double, double* %41
%329 = call double @llvm.fmuladd.f64(double %324, double %327, double %328)
store double %329, double* %41
%330 = load double*, double** %34
%331 = getelementptr inbounds double, double* %330, i64 2
%332 = load double, double* %331
%333 = load double*, double** %35
%334 = getelementptr inbounds double, double* %333, i64 14
%335 = load double, double* %334
%336 = fmul double %332, %335
%337 = load double*, double** %33
%338 = getelementptr inbounds double, double* %337, i64 14
%339 = load double, double* %338
%340 = load double, double* %41
%341 = call double @llvm.fmuladd.f64(double %336, double %339, double %340)
store double %341, double* %41
%342 = load double*, double** %34
%343 = getelementptr inbounds double, double* %342, i64 3
%344 = load double, double* %343
%345 = load double*, double** %35
%346 = getelementptr inbounds double, double* %345, i64 15
%347 = load double, double* %346
%348 = fmul double %344, %347
%349 = load double*, double** %33
%350 = getelementptr inbounds double, double* %349, i64 15
%351 = load double, double* %350
%352 = load double, double* %41
%353 = call double @llvm.fmuladd.f64(double %348, double %351, double %352)
store double %353, double* %41
%354 = load i32*, i32** %20
%355 = load i32, i32* %32
%356 = sext i32 %355 to i64
%357 = getelementptr inbounds i32, i32* %354, i64 %356
%358 = load i32, i32* %357
%359 = icmp slt i32 %358, 4
br i1 %359, label %360, label %381
360: ; preds = %147
%361 = load double, double* %37
%362 = load double, double* %41
%363 = load i32*, i32** %20
%364 = load i32, i32* %32
%365 = sext i32 %364 to i64
%366 = getelementptr inbounds i32, i32* %363, i64 %365
%367 = load i32, i32* %366
%368 = sext i32 %367 to i64
%369 = getelementptr inbounds [4 x double], [4 x double]* %36, i64 0, i64 %368
%370 = load double, double* %369
%371 = call double @llvm.fmuladd.f64(double %361, double %362, double %370)
%372 = load i32*, i32** %18
%373 = load i32, i32* %32
%374 = sext i32 %373 to i64
%375 = getelementptr inbounds i32, i32* %372, i64 %374
%376 = load i32, i32* %375
%377 = sitofp i32 %376 to double
%378 = call double @pow(double 0x2FF0000000000000, double %377)
%379 = fmul double %371, %378
%380 = call double @log(double %379)
store double %380, double* %41
br label %394
381: ; preds = %147
%382 = load double, double* %37
%383 = load double, double* %41
%384 = fmul double %382, %383
%385 = call double @log(double %384)
%386 = load i32*, i32** %18
%387 = load i32, i32* %32
%388 = sext i32 %387 to i64
%389 = getelementptr inbounds i32, i32* %386, i64 %388
%390 = load i32, i32* %389
%391 = sitofp i32 %390 to double
%392 = call double @log(double 0x2FF0000000000000)
%393 = call double @llvm.fmuladd.f64(double %391, double %392, double %385)
store double %393, double* %41
br label %394
394: ; preds = %381, %360
%395 = load i32*, i32** %19
%396 = load i32, i32* %32
%397 = sext i32 %396 to i64
%398 = getelementptr inbounds i32, i32* %395, i64 %397
%399 = load i32, i32* %398
%400 = sitofp i32 %399 to double
%401 = load double, double* %41
%402 = load double, double* %38
%403 = call double @llvm.fmuladd.f64(double %400, double %401, double %402)
store double %403, double* %38
br label %404
404: ; preds = %394
%405 = load i32, i32* %32
%406 = add nsw i32 %405, 1
store i32 %406, i32* %32
br label %143
407: ; preds = %143
%408 = load double*, double** %33
%409 = bitcast double* %408 to i8*
%410 = load double, double* %38
store double %410, double* %16
br label %688
411: ; preds = %138
%412 = load i32, i32* %30
store i32 %412, i32* %32
br label %413
413: ; preds = %681, %411
%414 = load i32, i32* %32
%415 = load i32, i32* %31
%416 = icmp slt i32 %414, %415
br i1 %416, label %417, label %684
417: ; preds = %413
%418 = load double*, double** %21
%419 = load i32, i32* %32
%420 = mul nsw i32 16, %419
%421 = sext i32 %420 to i64
%422 = getelementptr inbounds double, double* %418, i64 %421
store double* %422, double** %34
%423 = load double*, double** %22
%424 = load i32, i32* %32
%425 = mul nsw i32 16, %424
%426 = sext i32 %425 to i64
%427 = getelementptr inbounds double, double* %423, i64 %426
store double* %427, double** %35
%428 = load double*, double** %34
%429 = getelementptr inbounds double, double* %428, i64 0
%430 = load double, double* %429
%431 = load double*, double** %35
%432 = getelementptr inbounds double, double* %431, i64 0
%433 = load double, double* %432
%434 = fmul double %430, %433
%435 = load double*, double** %33
%436 = getelementptr inbounds double, double* %435, i64 0
%437 = load double, double* %436
%438 = fmul double %434, %437
store double %438, double* %41
%439 = load double*, double** %34
%440 = getelementptr inbounds double, double* %439, i64 1
%441 = load double, double* %440
%442 = load double*, double** %35
%443 = getelementptr inbounds double, double* %442, i64 1
%444 = load double, double* %443
%445 = fmul double %441, %444
%446 = load double*, double** %33
%447 = getelementptr inbounds double, double* %446, i64 1
%448 = load double, double* %447
%449 = load double, double* %41
%450 = call double @llvm.fmuladd.f64(double %445, double %448, double %449)
store double %450, double* %41
%451 = load double*, double** %34
%452 = getelementptr inbounds double, double* %451, i64 2
%453 = load double, double* %452
%454 = load double*, double** %35
%455 = getelementptr inbounds double, double* %454, i64 2
%456 = load double, double* %455
%457 = fmul double %453, %456
%458 = load double*, double** %33
%459 = getelementptr inbounds double, double* %458, i64 2
%460 = load double, double* %459
%461 = load double, double* %41
%462 = call double @llvm.fmuladd.f64(double %457, double %460, double %461)
store double %462, double* %41
%463 = load double*, double** %34
%464 = getelementptr inbounds double, double* %463, i64 3
%465 = load double, double* %464
%466 = load double*, double** %35
%467 = getelementptr inbounds double, double* %466, i64 3
%468 = load double, double* %467
%469 = fmul double %465, %468
%470 = load double*, double** %33
%471 = getelementptr inbounds double, double* %470, i64 3
%472 = load double, double* %471
%473 = load double, double* %41
%474 = call double @llvm.fmuladd.f64(double %469, double %472, double %473)
store double %474, double* %41
%475 = load double*, double** %34
%476 = getelementptr inbounds double, double* %475, i64 4
%477 = load double, double* %476
%478 = load double*, double** %35
%479 = getelementptr inbounds double, double* %478, i64 4
%480 = load double, double* %479
%481 = fmul double %477, %480
%482 = load double*, double** %33
%483 = getelementptr inbounds double, double* %482, i64 4
%484 = load double, double* %483
%485 = load double, double* %41
%486 = call double @llvm.fmuladd.f64(double %481, double %484, double %485)
store double %486, double* %41
%487 = load double*, double** %34
%488 = getelementptr inbounds double, double* %487, i64 5
%489 = load double, double* %488
%490 = load double*, double** %35
%491 = getelementptr inbounds double, double* %490, i64 5
%492 = load double, double* %491
%493 = fmul double %489, %492
%494 = load double*, double** %33
%495 = getelementptr inbounds double, double* %494, i64 5
%496 = load double, double* %495
%497 = load double, double* %41
%498 = call double @llvm.fmuladd.f64(double %493, double %496, double %497)
store double %498, double* %41
%499 = load double*, double** %34
%500 = getelementptr inbounds double, double* %499, i64 6
%501 = load double, double* %500
%502 = load double*, double** %35
%503 = getelementptr inbounds double, double* %502, i64 6
%504 = load double, double* %503
%505 = fmul double %501, %504
%506 = load double*, double** %33
%507 = getelementptr inbounds double, double* %506, i64 6
%508 = load double, double* %507
%509 = load double, double* %41
%510 = call double @llvm.fmuladd.f64(double %505, double %508, double %509)
store double %510, double* %41
%511 = load double*, double** %34
%512 = getelementptr inbounds double, double* %511, i64 7
%513 = load double, double* %512
%514 = load double*, double** %35
%515 = getelementptr inbounds double, double* %514, i64 7
%516 = load double, double* %515
%517 = fmul double %513, %516
%518 = load double*, double** %33
%519 = getelementptr inbounds double, double* %518, i64 7
%520 = load double, double* %519
%521 = load double, double* %41
%522 = call double @llvm.fmuladd.f64(double %517, double %520, double %521)
store double %522, double* %41
%523 = load double*, double** %34
%524 = getelementptr inbounds double, double* %523, i64 8
%525 = load double, double* %524
%526 = load double*, double** %35
%527 = getelementptr inbounds double, double* %526, i64 8
%528 = load double, double* %527
%529 = fmul double %525, %528
%530 = load double*, double** %33
%531 = getelementptr inbounds double, double* %530, i64 8
%532 = load double, double* %531
%533 = load double, double* %41
%534 = call double @llvm.fmuladd.f64(double %529, double %532, double %533)
store double %534, double* %41
%535 = load double*, double** %34
%536 = getelementptr inbounds double, double* %535, i64 9
%537 = load double, double* %536
%538 = load double*, double** %35
%539 = getelementptr inbounds double, double* %538, i64 9
%540 = load double, double* %539
%541 = fmul double %537, %540
%542 = load double*, double** %33
%543 = getelementptr inbounds double, double* %542, i64 9
%544 = load double, double* %543
%545 = load double, double* %41
%546 = call double @llvm.fmuladd.f64(double %541, double %544, double %545)
store double %546, double* %41
%547 = load double*, double** %34
%548 = getelementptr inbounds double, double* %547, i64 10
%549 = load double, double* %548
%550 = load double*, double** %35
%551 = getelementptr inbounds double, double* %550, i64 10
%552 = load double, double* %551
%553 = fmul double %549, %552
%554 = load double*, double** %33
%555 = getelementptr inbounds double, double* %554, i64 10
%556 = load double, double* %555
%557 = load double, double* %41
%558 = call double @llvm.fmuladd.f64(double %553, double %556, double %557)
store double %558, double* %41
%559 = load double*, double** %34
%560 = getelementptr inbounds double, double* %559, i64 11
%561 = load double, double* %560
%562 = load double*, double** %35
%563 = getelementptr inbounds double, double* %562, i64 11
%564 = load double, double* %563
%565 = fmul double %561, %564
%566 = load double*, double** %33
%567 = getelementptr inbounds double, double* %566, i64 11
%568 = load double, double* %567
%569 = load double, double* %41
%570 = call double @llvm.fmuladd.f64(double %565, double %568, double %569)
store double %570, double* %41
%571 = load double*, double** %34
%572 = getelementptr inbounds double, double* %571, i64 12
%573 = load double, double* %572
%574 = load double*, double** %35
%575 = getelementptr inbounds double, double* %574, i64 12
%576 = load double, double* %575
%577 = fmul double %573, %576
%578 = load double*, double** %33
%579 = getelementptr inbounds double, double* %578, i64 12
%580 = load double, double* %579
%581 = load double, double* %41
%582 = call double @llvm.fmuladd.f64(double %577, double %580, double %581)
store double %582, double* %41
%583 = load double*, double** %34
%584 = getelementptr inbounds double, double* %583, i64 13
%585 = load double, double* %584
%586 = load double*, double** %35
%587 = getelementptr inbounds double, double* %586, i64 13
%588 = load double, double* %587
%589 = fmul double %585, %588
%590 = load double*, double** %33
%591 = getelementptr inbounds double, double* %590, i64 13
%592 = load double, double* %591
%593 = load double, double* %41
%594 = call double @llvm.fmuladd.f64(double %589, double %592, double %593)
store double %594, double* %41
%595 = load double*, double** %34
%596 = getelementptr inbounds double, double* %595, i64 14
%597 = load double, double* %596
%598 = load double*, double** %35
%599 = getelementptr inbounds double, double* %598, i64 14
%600 = load double, double* %599
%601 = fmul double %597, %600
%602 = load double*, double** %33
%603 = getelementptr inbounds double, double* %602, i64 14
%604 = load double, double* %603
%605 = load double, double* %41
%606 = call double @llvm.fmuladd.f64(double %601, double %604, double %605)
store double %606, double* %41
%607 = load double*, double** %34
%608 = getelementptr inbounds double, double* %607, i64 15
%609 = load double, double* %608
%610 = load double*, double** %35
%611 = getelementptr inbounds double, double* %610, i64 15
%612 = load double, double* %611
%613 = fmul double %609, %612
%614 = load double*, double** %33
%615 = getelementptr inbounds double, double* %614, i64 15
%616 = load double, double* %615
%617 = load double, double* %41
%618 = call double @llvm.fmuladd.f64(double %613, double %616, double %617)
store double %618, double* %41
%619 = load i32*, i32** %20
%620 = load i32, i32* %32
%621 = sext i32 %620 to i64
%622 = getelementptr inbounds i32, i32* %619, i64 %621
%623 = load i32, i32* %622
%624 = icmp slt i32 %623, 4
br i1 %624, label %625, label %652
625: ; preds = %417
%626 = load double, double* %37
%627 = load double, double* %41
%628 = load i32*, i32** %20
%629 = load i32, i32* %32
%630 = sext i32 %629 to i64
%631 = getelementptr inbounds i32, i32* %628, i64 %630
%632 = load i32, i32* %631
%633 = sext i32 %632 to i64
%634 = getelementptr inbounds [4 x double], [4 x double]* %36, i64 0, i64 %633
%635 = load double, double* %634
%636 = call double @llvm.fmuladd.f64(double %626, double %627, double %635)
%637 = load i32*, i32** %18
%638 = load i32, i32* %32
%639 = sext i32 %638 to i64
%640 = getelementptr inbounds i32, i32* %637, i64 %639
%641 = load i32, i32* %640
%642 = load i32*, i32** %17
%643 = load i32, i32* %32
%644 = sext i32 %643 to i64
%645 = getelementptr inbounds i32, i32* %642, i64 %644
%646 = load i32, i32* %645
%647 = add nsw i32 %641, %646
%648 = sitofp i32 %647 to double
%649 = call double @pow(double 0x2FF0000000000000, double %648)
%650 = fmul double %636, %649
%651 = call double @log(double %650)
store double %651, double* %41
br label %671
652: ; preds = %417
%653 = load double, double* %37
%654 = load double, double* %41
%655 = fmul double %653, %654
%656 = call double @log(double %655)
%657 = load i32*, i32** %17
%658 = load i32, i32* %32
%659 = sext i32 %658 to i64
%660 = getelementptr inbounds i32, i32* %657, i64 %659
%661 = load i32, i32* %660
%662 = load i32*, i32** %18
%663 = load i32, i32* %32
%664 = sext i32 %663 to i64
%665 = getelementptr inbounds i32, i32* %662, i64 %664
%666 = load i32, i32* %665
%667 = add nsw i32 %661, %666
%668 = sitofp i32 %667 to double
%669 = call double @log(double 0x2FF0000000000000)
%670 = call double @llvm.fmuladd.f64(double %668, double %669, double %656)
store double %670, double* %41
br label %671
671: ; preds = %652, %625
%672 = load i32*, i32** %19
%673 = load i32, i32* %32
%674 = sext i32 %673 to i64
%675 = getelementptr inbounds i32, i32* %672, i64 %674
%676 = load i32, i32* %675
%677 = sitofp i32 %676 to double
%678 = load double, double* %41
%679 = load double, double* %38
%680 = call double @llvm.fmuladd.f64(double %677, double %678, double %679)
store double %680, double* %38
br label %681
681: ; preds = %671
%682 = load i32, i32* %32
%683 = add nsw i32 %682, 1
store i32 %683, i32* %32
br label %413
684: ; preds = %413
%685 = load double*, double** %33
%686 = bitcast double* %685 to i8*
%687 = load double, double* %38
store double %687, double* %16
br label %688
688: ; preds = %684, %407
%689 = load double, double* %16
ret double %689
}

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