#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 */
scalar_t__ calloc(int, int);
double exp(double);
double log(double);
int pow(int, int);
double *madau_absorption(double *lambda, int n_lambda, double z) {
  double *attenuation;
  double lylambda[32];
  double madauA[32];
  attenuation = (double *)calloc(n_lambda, sizeof(double));
  int nseries = 4;
  for (int i = 0; i < n_lambda; i++)
    attenuation[i] = 1.0;
  double l;
  double xc, xem;
  double teffline, teffcont, tefftot;
  double lmin, lmax;
  for (int i = 2; i <= nseries + 1; i++)
    lylambda[i - 2] = 912. * pow(i, 2) / (pow(i, 2) - 1);
  madauA[0] = 0.0036;
  madauA[1] = 0.0017;
  madauA[2] = 0.0012;
  madauA[3] = 0.00093;
  for (int j = 0; j < n_lambda; j++) {
    l = lambda[j];
    teffline = 0.0;
    for (int i = 0; i < nseries; i++) {
      lmin = lylambda[i];
      lmax = lylambda[i] * (1.0 + z);
      if ((l >= lmin) && (l <= lmax)) {
        teffline += madauA[i] * exp(3.46 * log(l / lylambda[i]));
      }
    }
    xc = l / 912.0;
    xem = 1.0 + z;
    if (xc < 1.0)
      xc = 1.0;
    if (xc > xem)
      xc = xem;
    teffcont =
        0.25 * xc * xc * xc * (exp(0.46 * log(xem)) - exp(0.46 * log(xc)));
    teffcont +=
        9.4 * exp(1.5 * log(xc)) * (exp(0.18 * log(xem)) - exp(0.18 * log(xc)));
    teffcont +=
        -0.7 * xc * xc * xc * (exp(-1.32 * log(xc)) - exp(-1.32 * log(xem)));
    teffcont += -0.023 * (exp(1.68 * log(xem)) - exp(1.68 * log(xc)));
    tefftot = teffline + teffcont;
    attenuation[j] *= exp(-tefftot);
  }
  return attenuation;
}


x86 assembly (clang, -O0):
<madau_absorption>:
push   %rbp
mov    %rsp,%rbp
sub    $0x2c0,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    -0xc(%rbp),%edi
mov    $0x8,%esi
call   1030 <calloc@plt>
mov    %rax,-0x20(%rbp)
movl   $0x4,-0x224(%rbp)
movl   $0x0,-0x228(%rbp)
mov    -0x228(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11b7 <madau_absorption+0x77>
mov    -0x20(%rbp),%rax
movslq -0x228(%rbp),%rcx
movsd  0xe82(%rip),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x228(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x228(%rbp)
jmp    117c <madau_absorption+0x3c>
movl   $0x2,-0x26c(%rbp)
mov    -0x26c(%rbp),%eax
mov    -0x224(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jg     124b <madau_absorption+0x10b>
mov    -0x26c(%rbp),%edi
mov    $0x2,%esi
call   1060 <pow@plt>
cvtsi2sd %eax,%xmm1
movsd  0xe34(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x280(%rbp)
ff
mov    -0x26c(%rbp),%edi
mov    $0x2,%esi
call   1060 <pow@plt>
movsd  -0x280(%rbp),%xmm0
ff
sub    $0x1,%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
mov    -0x26c(%rbp),%eax
sub    $0x2,%eax
cltq
movsd  %xmm0,-0x120(%rbp,%rax,8)
ff ff
mov    -0x26c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x26c(%rbp)
jmp    11c1 <madau_absorption+0x81>
movsd  0xdc5(%rip),%xmm0
movsd  %xmm0,-0x220(%rbp)
ff
movsd  0xdad(%rip),%xmm0
movsd  %xmm0,-0x218(%rbp)
ff
movsd  0xd95(%rip),%xmm0
movsd  %xmm0,-0x210(%rbp)
ff
movsd  0xd7d(%rip),%xmm0
movsd  %xmm0,-0x208(%rbp)
ff
movl   $0x0,-0x270(%rbp)
mov    -0x270(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    171b <madau_absorption+0x5db>
mov    -0x8(%rbp),%rax
movslq -0x270(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x230(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x248(%rbp)
ff
movl   $0x0,-0x274(%rbp)
mov    -0x274(%rbp),%eax
cmp    -0x224(%rbp),%eax
jge    13d9 <madau_absorption+0x299>
movslq -0x274(%rbp),%rax
movsd  -0x120(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x260(%rbp)
ff
movslq -0x274(%rbp),%rax
movsd  -0x120(%rbp,%rax,8),%xmm0
ff ff
movsd  0xd0d(%rip),%xmm1
addsd  -0x18(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x268(%rbp)
ff
movsd  -0x230(%rbp),%xmm0
ff
ucomisd -0x260(%rbp),%xmm0
ff
jb     13c0 <madau_absorption+0x280>
movsd  -0x230(%rbp),%xmm1
ff
movsd  -0x268(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jb     13c0 <madau_absorption+0x280>
movslq -0x274(%rbp),%rax
movsd  -0x220(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0x288(%rbp)
ff
movsd  -0x230(%rbp),%xmm0
ff
movslq -0x274(%rbp),%rax
divsd  -0x120(%rbp,%rax,8),%xmm0
ff ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0xce4(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movaps %xmm0,%xmm2
movsd  -0x288(%rbp),%xmm0
ff
movsd  -0x248(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x248(%rbp)
ff
jmp    13c5 <madau_absorption+0x285>
mov    -0x274(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x274(%rbp)
jmp    12d1 <madau_absorption+0x191>
movsd  -0x230(%rbp),%xmm0
ff
movsd  0xc3f(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x238(%rbp)
ff
movsd  0xc23(%rip),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x240(%rbp)
ff
movsd  0xc0e(%rip),%xmm0
ucomisd -0x238(%rbp),%xmm0
ff
jbe    1430 <madau_absorption+0x2f0>
movsd  0xbf8(%rip),%xmm0
movsd  %xmm0,-0x238(%rbp)
ff
movsd  -0x238(%rbp),%xmm0
ff
ucomisd -0x240(%rbp),%xmm0
ff
jbe    1456 <madau_absorption+0x316>
movsd  -0x240(%rbp),%xmm0
ff
movsd  %xmm0,-0x238(%rbp)
ff
movsd  0xc12(%rip),%xmm0
mulsd  -0x238(%rbp),%xmm0
ff
mulsd  -0x238(%rbp),%xmm0
ff
mulsd  -0x238(%rbp),%xmm0
ff
movsd  %xmm0,-0x2b8(%rbp)
ff
movsd  -0x240(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0xbd2(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  %xmm0,-0x2c0(%rbp)
ff
movsd  -0x238(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0xba9(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  -0x2c0(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0x2b8(%rbp),%xmm0
ff
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x250(%rbp)
ff
movsd  -0x238(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0xb5d(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movaps %xmm0,%xmm1
movsd  0xb41(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x2a8(%rbp)
ff
movsd  -0x240(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0xb15(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  %xmm0,-0x2b0(%rbp)
ff
movsd  -0x238(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0xaec(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  -0x2b0(%rbp),%xmm2
ff
movaps %xmm0,%xmm1
movsd  -0x2a8(%rbp),%xmm0
ff
subsd  %xmm1,%xmm2
movsd  -0x250(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x250(%rbp)
ff
movsd  0xaa4(%rip),%xmm0
mulsd  -0x238(%rbp),%xmm0
ff
mulsd  -0x238(%rbp),%xmm0
ff
mulsd  -0x238(%rbp),%xmm0
ff
movsd  %xmm0,-0x298(%rbp)
ff
movsd  -0x238(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0xa64(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  %xmm0,-0x2a0(%rbp)
ff
movsd  -0x240(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0xa3b(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  -0x2a0(%rbp),%xmm2
ff
movaps %xmm0,%xmm1
movsd  -0x298(%rbp),%xmm0
ff
subsd  %xmm1,%xmm2
movsd  -0x250(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x250(%rbp)
ff
movsd  -0x240(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0x9e3(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  %xmm0,-0x290(%rbp)
ff
movsd  -0x238(%rbp),%xmm0
ff
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  0x9ba(%rip),%xmm0
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movaps %xmm0,%xmm1
movsd  -0x290(%rbp),%xmm0
ff
subsd  %xmm1,%xmm0
movsd  -0x250(%rbp),%xmm1
ff
movsd  0x98a(%rip),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x250(%rbp)
ff
movsd  -0x248(%rbp),%xmm0
ff
addsd  -0x250(%rbp),%xmm0
ff
movsd  %xmm0,-0x258(%rbp)
ff
movsd  -0x258(%rbp),%xmm0
ff
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
call   1040 <exp@plt>
mov    -0x20(%rbp),%rax
movslq -0x270(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x270(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x270(%rbp)
jmp    1295 <madau_absorption+0x155>
mov    -0x20(%rbp),%rax
add    $0x2c0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<madau_absorption>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x88,%rsp
movsd  %xmm0,0x20(%rsp)
mov    %esi,%ebp
mov    %rdi,%r14
mov    %esi,%edi
mov    $0x8,%esi
call   1030 <calloc@plt>
mov    %rax,%rbx
mov    %ebp,%r12d
test   %ebp,%ebp
jle    129d <madau_absorption+0x15d>
cmp    $0x4,%ebp
jae    1182 <madau_absorption+0x42>
xor    %eax,%eax
jmp    1279 <madau_absorption+0x139>
mov    %r12d,%eax
and    $0xfffffffc,%eax
lea    -0x4(%rax),%rsi
mov    %rsi,%rdx
shr    $0x2,%rdx
add    $0x1,%rdx
mov    %edx,%ecx
and    $0x7,%ecx
cmp    $0x1c,%rsi
jae    11a9 <madau_absorption+0x69>
xor    %esi,%esi
jmp    1245 <madau_absorption+0x105>
and    $0xfffffffffffffff8,%rdx
xor    %esi,%esi
movapd 0xe49(%rip),%xmm0
nopw   0x0(%rax,%rax,1)
movupd %xmm0,(%rbx,%rsi,8)
movupd %xmm0,0x10(%rbx,%rsi,8)
movupd %xmm0,0x20(%rbx,%rsi,8)
movupd %xmm0,0x30(%rbx,%rsi,8)
movupd %xmm0,0x40(%rbx,%rsi,8)
movupd %xmm0,0x50(%rbx,%rsi,8)
movupd %xmm0,0x60(%rbx,%rsi,8)
movupd %xmm0,0x70(%rbx,%rsi,8)
movupd %xmm0,0x80(%rbx,%rsi,8)
movupd %xmm0,0x90(%rbx,%rsi,8)
movupd %xmm0,0xa0(%rbx,%rsi,8)
movupd %xmm0,0xb0(%rbx,%rsi,8)
movupd %xmm0,0xc0(%rbx,%rsi,8)
movupd %xmm0,0xd0(%rbx,%rsi,8)
movupd %xmm0,0xe0(%rbx,%rsi,8)
movupd %xmm0,0xf0(%rbx,%rsi,8)
add    $0x20,%rsi
add    $0xfffffffffffffff8,%rdx
jne    11c0 <madau_absorption+0x80>
test   %rcx,%rcx
je     1274 <madau_absorption+0x134>
lea    (%rbx,%rsi,8),%rdx
add    $0x10,%rdx
shl    $0x5,%rcx
xor    %esi,%esi
movapd 0xda0(%rip),%xmm0
movupd %xmm0,-0x10(%rdx,%rsi,1)
movupd %xmm0,(%rdx,%rsi,1)
add    $0x20,%rsi
cmp    %rsi,%rcx
jne    1260 <madau_absorption+0x120>
cmp    %r12,%rax
je     129d <madau_absorption+0x15d>
movabs $0x3ff0000000000000,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %rcx,(%rbx,%rax,8)
add    $0x1,%rax
cmp    %rax,%r12
jne    1290 <madau_absorption+0x150>
mov    $0x2,%edi
mov    $0x2,%esi
call   1060 <pow@plt>
mov    %eax,0x18(%rsp)
mov    $0x2,%edi
mov    $0x2,%esi
call   1060 <pow@plt>
mov    %ebp,0x8(%rsp)
mov    %eax,%ebp
mov    $0x3,%edi
mov    $0x2,%esi
call   1060 <pow@plt>
mov    %eax,0x10(%rsp)
mov    $0x3,%edi
mov    $0x2,%esi
call   1060 <pow@plt>
mov    %eax,%r15d
mov    $0x4,%edi
mov    $0x2,%esi
call   1060 <pow@plt>
mov    %eax,0x30(%rsp)
mov    $0x4,%edi
mov    $0x2,%esi
call   1060 <pow@plt>
mov    %eax,%r13d
mov    $0x5,%edi
mov    $0x2,%esi
call   1060 <pow@plt>
mov    %eax,0x28(%rsp)
mov    $0x5,%edi
mov    $0x2,%esi
call   1060 <pow@plt>
cmpl   $0x0,0x8(%rsp)
jle    1776 <madau_absorption+0x636>
add    $0xffffffff,%ebp
add    $0xffffffff,%r15d
add    $0xffffffff,%r13d
cvtsi2sdl 0x18(%rsp),%xmm1
add    $0xffffffff,%eax
movsd  0xcc8(%rip),%xmm2
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
mulsd  %xmm2,%xmm1
divsd  %xmm0,%xmm1
cvtsi2sdl 0x10(%rsp),%xmm3
mulsd  %xmm2,%xmm3
xorps  %xmm0,%xmm0
cvtsi2sd %r15d,%xmm0
divsd  %xmm0,%xmm3
cvtsi2sdl 0x30(%rsp),%xmm4
xorps  %xmm0,%xmm0
cvtsi2sd %r13d,%xmm0
mulsd  %xmm2,%xmm4
divsd  %xmm0,%xmm4
cvtsi2sdl 0x28(%rsp),%xmm5
mulsd  %xmm2,%xmm5
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
divsd  %xmm0,%xmm5
movsd  0x20(%rsp),%xmm0
addsd  0xc72(%rip),%xmm0
movapd %xmm0,%xmm2
movsd  %xmm1,0x60(%rsp)
mulsd  %xmm1,%xmm2
movsd  %xmm2,0x80(%rsp)
movapd %xmm0,%xmm1
movsd  %xmm3,0x58(%rsp)
mulsd  %xmm3,%xmm1
movsd  %xmm1,0x78(%rsp)
movapd %xmm0,%xmm1
movsd  %xmm4,0x50(%rsp)
mulsd  %xmm4,%xmm1
movsd  %xmm1,0x70(%rsp)
movsd  %xmm0,0x20(%rsp)
movsd  %xmm5,0x48(%rsp)
mulsd  %xmm5,%xmm0
movsd  %xmm0,0x68(%rsp)
xor    %ebp,%ebp
jmp    1618 <madau_absorption+0x4d8>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
divsd  0xbf8(%rip),%xmm2
movsd  0xbf8(%rip),%xmm3
maxsd  %xmm2,%xmm3
movsd  0x20(%rsp),%xmm0
movapd %xmm0,%xmm1
minsd  %xmm3,%xmm1
movsd  %xmm1,0x8(%rsp)
movapd %xmm1,%xmm2
mulsd  0xc04(%rip),%xmm2
mulsd  %xmm1,%xmm2
mulsd  %xmm1,%xmm2
movsd  %xmm2,0x30(%rsp)
call   1050 <log@plt>
movsd  0xbf1(%rip),%xmm1
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  %xmm0,0x10(%rsp)
movsd  0x8(%rsp),%xmm0
call   1050 <log@plt>
mulsd  0xbcf(%rip),%xmm0
call   1040 <exp@plt>
movsd  0x10(%rsp),%xmm1
subsd  %xmm0,%xmm1
mulsd  0x30(%rsp),%xmm1
movsd  %xmm1,0x10(%rsp)
movsd  0x8(%rsp),%xmm0
call   1050 <log@plt>
mulsd  0xba9(%rip),%xmm0
call   1040 <exp@plt>
mulsd  0xba4(%rip),%xmm0
movsd  %xmm0,0x28(%rsp)
movsd  0x20(%rsp),%xmm0
call   1050 <log@plt>
movsd  0xb93(%rip),%xmm1
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  %xmm0,0x30(%rsp)
movsd  0x8(%rsp),%xmm0
call   1050 <log@plt>
mulsd  0xb71(%rip),%xmm0
call   1040 <exp@plt>
movsd  0x30(%rsp),%xmm1
subsd  %xmm0,%xmm1
mulsd  0x28(%rsp),%xmm1
addsd  0x10(%rsp),%xmm1
movsd  %xmm1,0x30(%rsp)
movsd  0x8(%rsp),%xmm0
movapd %xmm0,%xmm1
mulsd  0xb46(%rip),%xmm1
mulsd  %xmm0,%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,0x28(%rsp)
call   1050 <log@plt>
movsd  0xb33(%rip),%xmm1
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movsd  %xmm0,0x10(%rsp)
movsd  0x20(%rsp),%xmm0
call   1050 <log@plt>
mulsd  0xb11(%rip),%xmm0
call   1040 <exp@plt>
movsd  0x10(%rsp),%xmm1
subsd  %xmm0,%xmm1
mulsd  0x28(%rsp),%xmm1
addsd  0x30(%rsp),%xmm1
movsd  %xmm1,0x10(%rsp)
movsd  0x20(%rsp),%xmm0
call   1050 <log@plt>
movsd  0xae5(%rip),%xmm1
mulsd  %xmm1,%xmm0
call   1040 <exp@plt>
movapd %xmm0,0x30(%rsp)
movsd  0x8(%rsp),%xmm0
call   1050 <log@plt>
mulsd  0xac3(%rip),%xmm0
call   1040 <exp@plt>
movapd 0x30(%rsp),%xmm1
subsd  %xmm0,%xmm1
mulsd  0xab4(%rip),%xmm1
addsd  0x10(%rsp),%xmm1
addsd  0x18(%rsp),%xmm1
xorpd  0xa18(%rip),%xmm1
movapd %xmm1,%xmm0
call   1040 <exp@plt>
mulsd  (%rbx,%rbp,8),%xmm0
movsd  %xmm0,(%rbx,%rbp,8)
add    $0x1,%rbp
cmp    %rbp,%r12
je     1776 <madau_absorption+0x636>
movsd  (%r14,%rbp,8),%xmm2
ucomisd 0x60(%rsp),%xmm2
xorpd  %xmm1,%xmm1
movsd  %xmm2,0x8(%rsp)
jb     1679 <madau_absorption+0x539>
movsd  0x80(%rsp),%xmm0
ucomisd %xmm2,%xmm0
xorpd  %xmm1,%xmm1
jb     1679 <madau_absorption+0x539>
movapd %xmm2,%xmm0
divsd  0x60(%rsp),%xmm0
call   1050 <log@plt>
mulsd  0x9d6(%rip),%xmm0
call   1040 <exp@plt>
movsd  0x8(%rsp),%xmm2
movapd %xmm0,%xmm1
mulsd  0x9c7(%rip),%xmm1
addsd  0xa27(%rip),%xmm1
ucomisd 0x58(%rsp),%xmm2
jb     16c7 <madau_absorption+0x587>
movsd  0x78(%rsp),%xmm0
ucomisd %xmm2,%xmm0
jb     16c7 <madau_absorption+0x587>
movapd %xmm2,%xmm0
divsd  0x58(%rsp),%xmm0
movsd  %xmm1,0x18(%rsp)
call   1050 <log@plt>
mulsd  0x986(%rip),%xmm0
call   1040 <exp@plt>
movsd  0x8(%rsp),%xmm2
movsd  0x18(%rsp),%xmm1
mulsd  0x97d(%rip),%xmm0
addsd  %xmm0,%xmm1
ucomisd 0x50(%rsp),%xmm2
jb     1715 <madau_absorption+0x5d5>
movsd  0x70(%rsp),%xmm0
ucomisd %xmm2,%xmm0
jb     1715 <madau_absorption+0x5d5>
movapd %xmm2,%xmm0
divsd  0x50(%rsp),%xmm0
movsd  %xmm1,0x18(%rsp)
call   1050 <log@plt>
mulsd  0x938(%rip),%xmm0
call   1040 <exp@plt>
movsd  0x8(%rsp),%xmm2
movsd  0x18(%rsp),%xmm1
mulsd  0x937(%rip),%xmm0
addsd  %xmm0,%xmm1
ucomisd 0x48(%rsp),%xmm2
movsd  %xmm1,0x18(%rsp)
jb     1420 <madau_absorption+0x2e0>
movsd  0x68(%rsp),%xmm0
ucomisd %xmm2,%xmm0
jb     1420 <madau_absorption+0x2e0>
movapd %xmm2,%xmm0
divsd  0x48(%rsp),%xmm0
call   1050 <log@plt>
mulsd  0x8e2(%rip),%xmm0
call   1040 <exp@plt>
movsd  0x8(%rsp),%xmm2
mulsd  0x8ef(%rip),%xmm0
movsd  0x18(%rsp),%xmm1
addsd  %xmm0,%xmm1
movsd  %xmm1,0x18(%rsp)
jmp    1420 <madau_absorption+0x2e0>
mov    %rbx,%rax
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define double* @madau_absorption(double* nocapture %0, i32 %1, double %2) {
%4 = tail call i64 @calloc(i32 %1, i32 8)
%5 = inttoptr i64 %4 to double*
%6 = icmp sgt i32 %1, 0
br i1 %6, label %7, label %81
7: ; preds = %3
%8 = zext i32 %1 to i64
%9 = icmp ult i32 %1, 4
br i1 %9, label %79, label %10
10: ; preds = %7
%11 = and i64 %8, 4294967292
%12 = add nsw i64 %11, -4
%13 = lshr exact i64 %12, 2
%14 = add nuw nsw i64 %13, 1
%15 = and i64 %14, 7
%16 = icmp ult i64 %12, 28
br i1 %16, label %64, label %17
17: ; preds = %10
%18 = and i64 %14, 9223372036854775800
br label %19
19: ; preds = %19, %17
%20 = phi i64 [ 0, %17 ], [ %61, %19 ]
%21 = phi i64 [ 0, %17 ], [ %62, %19 ]
%22 = getelementptr inbounds double, double* %5, i64 %20
%23 = bitcast double* %22 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %23
%24 = getelementptr inbounds double, double* %22, i64 2
%25 = bitcast double* %24 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %25
%26 = or i64 %20, 4
%27 = getelementptr inbounds double, double* %5, i64 %26
%28 = bitcast double* %27 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %28
%29 = getelementptr inbounds double, double* %27, i64 2
%30 = bitcast double* %29 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %30
%31 = or i64 %20, 8
%32 = getelementptr inbounds double, double* %5, i64 %31
%33 = bitcast double* %32 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %33
%34 = getelementptr inbounds double, double* %32, i64 2
%35 = bitcast double* %34 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %35
%36 = or i64 %20, 12
%37 = getelementptr inbounds double, double* %5, i64 %36
%38 = bitcast double* %37 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %38
%39 = getelementptr inbounds double, double* %37, i64 2
%40 = bitcast double* %39 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %40
%41 = or i64 %20, 16
%42 = getelementptr inbounds double, double* %5, i64 %41
%43 = bitcast double* %42 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %43
%44 = getelementptr inbounds double, double* %42, i64 2
%45 = bitcast double* %44 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %45
%46 = or i64 %20, 20
%47 = getelementptr inbounds double, double* %5, i64 %46
%48 = bitcast double* %47 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %48
%49 = getelementptr inbounds double, double* %47, i64 2
%50 = bitcast double* %49 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %50
%51 = or i64 %20, 24
%52 = getelementptr inbounds double, double* %5, i64 %51
%53 = bitcast double* %52 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %53
%54 = getelementptr inbounds double, double* %52, i64 2
%55 = bitcast double* %54 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %55
%56 = or i64 %20, 28
%57 = getelementptr inbounds double, double* %5, i64 %56
%58 = bitcast double* %57 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %58
%59 = getelementptr inbounds double, double* %57, i64 2
%60 = bitcast double* %59 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %60
%61 = add nuw i64 %20, 32
%62 = add i64 %21, 8
%63 = icmp eq i64 %62, %18
br i1 %63, label %64, label %19
64: ; preds = %19, %10
%65 = phi i64 [ 0, %10 ], [ %61, %19 ]
%66 = icmp eq i64 %15, 0
br i1 %66, label %77, label %67
67: ; preds = %64, %67
%68 = phi i64 [ %74, %67 ], [ %65, %64 ]
%69 = phi i64 [ %75, %67 ], [ 0, %64 ]
%70 = getelementptr inbounds double, double* %5, i64 %68
%71 = bitcast double* %70 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %71
%72 = getelementptr inbounds double, double* %70, i64 2
%73 = bitcast double* %72 to <2 x double>*
store <2 x double> <double 1.000000e+00, double 1.000000e+00>, <2 x double>* %73
%74 = add nuw i64 %68, 4
%75 = add i64 %69, 1
%76 = icmp eq i64 %75, %15
br i1 %76, label %77, label %67
77: ; preds = %67, %64
%78 = icmp eq i64 %11, %8
br i1 %78, label %81, label %79
79: ; preds = %7, %77
%80 = phi i64 [ 0, %7 ], [ %11, %77 ]
br label %110
81: ; preds = %110, %77, %3
%82 = tail call i32 @pow(i32 2, i32 2)
%83 = sitofp i32 %82 to double
%84 = fmul double %83, 9.120000e+02
%85 = tail call i32 @pow(i32 2, i32 2)
%86 = add nsw i32 %85, -1
%87 = sitofp i32 %86 to double
%88 = fdiv double %84, %87
%89 = tail call i32 @pow(i32 3, i32 2)
%90 = sitofp i32 %89 to double
%91 = fmul double %90, 9.120000e+02
%92 = tail call i32 @pow(i32 3, i32 2)
%93 = add nsw i32 %92, -1
%94 = sitofp i32 %93 to double
%95 = fdiv double %91, %94
%96 = tail call i32 @pow(i32 4, i32 2)
%97 = sitofp i32 %96 to double
%98 = fmul double %97, 9.120000e+02
%99 = tail call i32 @pow(i32 4, i32 2)
%100 = add nsw i32 %99, -1
%101 = sitofp i32 %100 to double
%102 = fdiv double %98, %101
%103 = tail call i32 @pow(i32 5, i32 2)
%104 = sitofp i32 %103 to double
%105 = fmul double %104, 9.120000e+02
%106 = tail call i32 @pow(i32 5, i32 2)
%107 = add nsw i32 %106, -1
%108 = sitofp i32 %107 to double
%109 = fdiv double %105, %108
br i1 %6, label %115, label %122
110: ; preds = %79, %110
%111 = phi i64 [ %113, %110 ], [ %80, %79 ]
%112 = getelementptr inbounds double, double* %5, i64 %111
store double 1.000000e+00, double* %112
%113 = add nuw nsw i64 %111, 1
%114 = icmp eq i64 %113, %8
br i1 %114, label %81, label %110
115: ; preds = %81
%116 = fadd double %2, 1.000000e+00
%117 = zext i32 %1 to i64
%118 = fmul double %116, %88
%119 = fmul double %116, %95
%120 = fmul double %116, %102
%121 = fmul double %116, %109
br label %123
122: ; preds = %169, %81
ret double* %5
123: ; preds = %115, %169
%124 = phi i64 [ 0, %115 ], [ %224, %169 ]
%125 = getelementptr inbounds double, double* %0, i64 %124
%126 = load double, double* %125
%127 = fcmp ult double %126, %88
%128 = fcmp ugt double %126, %118
%129 = or i1 %127, %128
br i1 %129, label %136, label %130
130: ; preds = %123
%131 = fdiv double %126, %88
%132 = tail call double @log(double %131)
%133 = fmul double %132, 3.460000e+00
%134 = tail call double @exp(double %133)
%135 = tail call double @llvm.fmuladd.f64(double %134, double 3.600000e-03, double 0.000000e+00)
br label %136
136: ; preds = %123, %130
%137 = phi double [ %135, %130 ], [ 0.000000e+00, %123 ]
%138 = fcmp ult double %126, %95
%139 = fcmp ugt double %126, %119
%140 = or i1 %138, %139
br i1 %140, label %147, label %141
141: ; preds = %136
%142 = fdiv double %126, %95
%143 = tail call double @log(double %142)
%144 = fmul double %143, 3.460000e+00
%145 = tail call double @exp(double %144)
%146 = tail call double @llvm.fmuladd.f64(double %145, double 1.700000e-03, double %137)
br label %147
147: ; preds = %141, %136
%148 = phi double [ %146, %141 ], [ %137, %136 ]
%149 = fcmp ult double %126, %102
%150 = fcmp ugt double %126, %120
%151 = or i1 %149, %150
br i1 %151, label %158, label %152
152: ; preds = %147
%153 = fdiv double %126, %102
%154 = tail call double @log(double %153)
%155 = fmul double %154, 3.460000e+00
%156 = tail call double @exp(double %155)
%157 = tail call double @llvm.fmuladd.f64(double %156, double 1.200000e-03, double %148)
br label %158
158: ; preds = %152, %147
%159 = phi double [ %157, %152 ], [ %148, %147 ]
%160 = fcmp ult double %126, %109
%161 = fcmp ugt double %126, %121
%162 = or i1 %160, %161
br i1 %162, label %169, label %163
163: ; preds = %158
%164 = fdiv double %126, %109
%165 = tail call double @log(double %164)
%166 = fmul double %165, 3.460000e+00
%167 = tail call double @exp(double %166)
%168 = tail call double @llvm.fmuladd.f64(double %167, double 9.300000e-04, double %159)
br label %169
169: ; preds = %163, %158
%170 = phi double [ %168, %163 ], [ %159, %158 ]
%171 = fdiv double %126, 9.120000e+02
%172 = fcmp olt double %171, 1.000000e+00
%173 = select i1 %172, double 1.000000e+00, double %171
%174 = fcmp ogt double %173, %116
%175 = select i1 %174, double %116, double %173
%176 = fmul double %175, 2.500000e-01
%177 = fmul double %175, %176
%178 = fmul double %175, %177
%179 = tail call double @log(double %116)
%180 = fmul double %179, 4.600000e-01
%181 = tail call double @exp(double %180)
%182 = tail call double @log(double %175)
%183 = fmul double %182, 4.600000e-01
%184 = tail call double @exp(double %183)
%185 = fsub double %181, %184
%186 = fmul double %178, %185
%187 = tail call double @log(double %175)
%188 = fmul double %187, 1.500000e+00
%189 = tail call double @exp(double %188)
%190 = fmul double %189, 9.400000e+00
%191 = tail call double @log(double %116)
%192 = fmul double %191, 1.800000e-01
%193 = tail call double @exp(double %192)
%194 = tail call double @log(double %175)
%195 = fmul double %194, 1.800000e-01
%196 = tail call double @exp(double %195)
%197 = fsub double %193, %196
%198 = tail call double @llvm.fmuladd.f64(double %190, double %197, double %186)
%199 = fmul double %175, 0xBFE6666666666666
%200 = fmul double %175, %199
%201 = fmul double %175, %200
%202 = tail call double @log(double %175)
%203 = fmul double %202, -1.320000e+00
%204 = tail call double @exp(double %203)
%205 = tail call double @log(double %116)
%206 = fmul double %205, -1.320000e+00
%207 = tail call double @exp(double %206)
%208 = fsub double %204, %207
%209 = tail call double @llvm.fmuladd.f64(double %201, double %208, double %198)
%210 = tail call double @log(double %116)
%211 = fmul double %210, 1.680000e+00
%212 = tail call double @exp(double %211)
%213 = tail call double @log(double %175)
%214 = fmul double %213, 1.680000e+00
%215 = tail call double @exp(double %214)
%216 = fsub double %212, %215
%217 = tail call double @llvm.fmuladd.f64(double %216, double -2.300000e-02, double %209)
%218 = fadd double %170, %217
%219 = fneg double %218
%220 = tail call double @exp(double %219)
%221 = getelementptr inbounds double, double* %5, i64 %124
%222 = load double, double* %221
%223 = fmul double %220, %222
store double %223, double* %221
%224 = add nuw nsw i64 %124, 1
%225 = icmp eq i64 %224, %117
br i1 %225, label %122, label %123
}