#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double log(double);
double pow(double, double);
void nicelin(double llimit, double ulimit, int max, double *val, int *nret) {
  int i, j, ij, ik, nexp, nrt;
  int nf0, ijof, mul, ikof;
  int done;
  double y, cy, xxu, xxl, del;
  double xncr[6] = {1.0, 2.0, 2.5, 5.0, 10.0, 0.0};
  nrt = 0;
  if (max != 0) {
    y = (ulimit - llimit) / max;
  } else {
    y = 0;
  }
  xxl = llimit;
  xxu = ulimit;
  nf0 = 1;
  if ((max <= 1) || (y == 0)) {
    nrt = 2;
    val[1] = xxl;
    *nret = nrt;
    return;
  }
  if (y < 0.0) {
    xxu = llimit;
    xxl = ulimit;
    y = -y;
  }
  cy = log(y) / 2.30258;
  mul = cy;
  if (cy < 1.0) {
    mul = mul - 1;
  }
  if (xxl > 0.0) {
    xxl = xxl / 0.9999;
    ijof = 0;
    if (max == 3) {
      nf0 = 0;
    }
  } else if (xxl == 0.0) {
    ijof = 0;
  } else {
    xxl = xxl * 0.9999;
    ijof = 1;
  }
  if (xxu > 0.0) {
    xxu = xxu * 0.9999;
    ikof = 1;
  } else if (xxu == 0.0) {
    ikof = 0;
  } else {
    xxu = xxu / 0.9999;
    ikof = 0;
  }
  del = 0;
  done = 0;
  for (j = 0; j < max; j++) {
    for (i = 0; i < 4; i++) {
      del = xncr[i] * pow(10.0, (double)mul);
      if (del == 0) {
        ij = -ijof;
        ik = ikof;
      } else {
        ij = xxl / del - ijof;
        ik = xxu / del + ikof;
      }
      nrt = ik - ij;
      if ((nrt + nf0) <= max) {
        done = 1;
        break;
      }
    }
    if (done == 1)
      break;
    mul++;
  }
  if (nrt <= 0) {
    nrt = 2;
    val[0] = llimit;
    val[1] = ulimit;
    *nret = nrt;
    return;
  }
  if (i == 2) {
    mul--;
  }
  val[0] = ij * del;
  for (j = 0; j < nrt; j++) {
    val[j + 1] = val[j] + del;
  }
  nexp = mul;
  (nrt)++;
  *nret = nrt;
}


x86 assembly (clang, -O0):
<nicelin>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
lea    -0xb0(%rbp),%rdi
xor    %esi,%esi
mov    $0x30,%edx
call   1030 <memset@plt>
movsd  0xeb5(%rip),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movsd  0xe9d(%rip),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
movsd  0xe85(%rip),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  0xe6d(%rip),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  0xe55(%rip),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movl   $0x0,-0x40(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     11e1 <nicelin+0xb1>
movsd  -0x10(%rbp),%xmm0
subsd  -0x8(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    11e9 <nicelin+0xb9>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x1,-0x44(%rbp)
cmpl   $0x1,-0x14(%rbp)
jle    1226 <nicelin+0xf6>
movsd  -0x60(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1249 <nicelin+0x119>
jp     1249 <nicelin+0x119>
movl   $0x2,-0x40(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x40(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
jmp    15ae <nicelin+0x47e>
xorps  %xmm0,%xmm0
ucomisd -0x60(%rbp),%xmm0
jbe    128c <nicelin+0x15c>
movsd  -0x8(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm0
call   1040 <log@plt>
movsd  0xd8a(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
cvttsd2si -0x68(%rbp),%eax
mov    %eax,-0x4c(%rbp)
movsd  0xd69(%rip),%xmm0
ucomisd -0x68(%rbp),%xmm0
jbe    12cb <nicelin+0x19b>
mov    -0x4c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4c(%rbp)
movsd  -0x78(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1310 <nicelin+0x1e0>
movsd  -0x78(%rbp),%xmm0
movsd  0xd46(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x0,-0x48(%rbp)
cmpl   $0x3,-0x14(%rbp)
jne    130b <nicelin+0x1db>
movl   $0x0,-0x44(%rbp)
jmp    1352 <nicelin+0x222>
movsd  -0x78(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1334 <nicelin+0x204>
jp     1334 <nicelin+0x204>
movl   $0x0,-0x48(%rbp)
jmp    134d <nicelin+0x21d>
movsd  0xcf4(%rip),%xmm0
mulsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x1,-0x48(%rbp)
jmp    1352 <nicelin+0x222>
movsd  -0x70(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1382 <nicelin+0x252>
movsd  0xcc4(%rip),%xmm0
mulsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x1,-0x50(%rbp)
jmp    13c8 <nicelin+0x298>
movsd  -0x70(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    13a6 <nicelin+0x276>
jp     13a6 <nicelin+0x276>
movl   $0x0,-0x50(%rbp)
jmp    13c3 <nicelin+0x293>
movsd  -0x70(%rbp),%xmm0
movsd  0xc7d(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movl   $0x0,-0x50(%rbp)
jmp    13c8 <nicelin+0x298>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x80(%rbp)
movl   $0x0,-0x54(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    14f2 <nicelin+0x3c2>
movl   $0x0,-0x2c(%rbp)
cmpl   $0x4,-0x2c(%rbp)
jge    14cc <nicelin+0x39c>
movslq -0x2c(%rbp),%rax
movsd  -0xb0(%rbp,%rax,8),%xmm0
ff ff
movsd  %xmm0,-0xb8(%rbp)
ff
cvtsi2sdl -0x4c(%rbp),%xmm1
movsd  0xbe3(%rip),%xmm0
call   1050 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0xb8(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1461 <nicelin+0x331>
jp     1461 <nicelin+0x331>
xor    %eax,%eax
sub    -0x48(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x50(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    1495 <nicelin+0x365>
movsd  -0x78(%rbp),%xmm0
divsd  -0x80(%rbp),%xmm0
cvtsi2sdl -0x48(%rbp),%xmm1
subsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x34(%rbp)
movsd  -0x70(%rbp),%xmm0
divsd  -0x80(%rbp),%xmm0
cvtsi2sdl -0x50(%rbp),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
sub    -0x34(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
add    -0x44(%rbp),%eax
cmp    -0x14(%rbp),%eax
jg     14b9 <nicelin+0x389>
movl   $0x1,-0x54(%rbp)
jmp    14cc <nicelin+0x39c>
jmp    14be <nicelin+0x38e>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    13f1 <nicelin+0x2c1>
cmpl   $0x1,-0x54(%rbp)
jne    14db <nicelin+0x3ab>
jmp    14f2 <nicelin+0x3c2>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    13de <nicelin+0x2ae>
cmpl   $0x0,-0x40(%rbp)
jg     152c <nicelin+0x3fc>
movl   $0x2,-0x40(%rbp)
movsd  -0x8(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x10(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x40(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
jmp    15ae <nicelin+0x47e>
cmpl   $0x2,-0x2c(%rbp)
jne    153f <nicelin+0x40f>
mov    -0x4c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4c(%rbp)
cvtsi2sdl -0x34(%rbp),%xmm0
mulsd  -0x80(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    1596 <nicelin+0x466>
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
addsd  -0x80(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1558 <nicelin+0x428>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
add    $0xc0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<nicelin>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x78,%rsp
mov    %rsi,%r12
movapd %xmm0,%xmm3
test   %edi,%edi
je     116b <nicelin+0x4b>
mov    %edi,%ebp
cmp    $0x2,%edi
jl     116b <nicelin+0x4b>
movapd %xmm1,%xmm4
subsd  %xmm3,%xmm4
xorps  %xmm0,%xmm0
cvtsi2sd %ebp,%xmm0
divsd  %xmm0,%xmm4
xorpd  %xmm2,%xmm2
ucomisd %xmm2,%xmm4
jne    115f <nicelin+0x3f>
jnp    116b <nicelin+0x4b>
ucomisd %xmm4,%xmm2
ja     117c <nicelin+0x5c>
movapd %xmm4,%xmm0
jmp    1188 <nicelin+0x68>
movsd  %xmm3,0x8(%r12)
mov    $0x2,%eax
jmp    150a <nicelin+0x3ea>
movapd 0xe7c(%rip),%xmm0
xorpd  %xmm4,%xmm0
mov    %rdx,0x48(%rsp)
cmpltsd %xmm2,%xmm4
movapd %xmm4,%xmm2
andpd  %xmm3,%xmm2
andnpd %xmm1,%xmm4
orpd   %xmm2,%xmm4
movapd %xmm4,0x10(%rsp)
movapd %xmm1,0x60(%rsp)
ja     11b4 <nicelin+0x94>
movapd %xmm3,%xmm1
movsd  %xmm1,0x8(%rsp)
movapd %xmm3,0x50(%rsp)
call   1030 <log@plt>
divsd  0xe43(%rip),%xmm0
movsd  0xe43(%rip),%xmm1
xor    %eax,%eax
ucomisd %xmm0,%xmm1
movsd  0x8(%rsp),%xmm1
seta   %cl
ucomisd 0xe54(%rip),%xmm1
jbe    120a <nicelin+0xea>
divsd  0xe2a(%rip),%xmm1
movsd  %xmm1,0x8(%rsp)
xor    %r15d,%r15d
cmp    $0x3,%ebp
setne  %r15b
xor    %ebx,%ebx
jmp    1245 <nicelin+0x125>
xorpd  %xmm1,%xmm1
movsd  0x8(%rsp),%xmm2
ucomisd %xmm1,%xmm2
movsd  0x8(%rsp),%xmm1
jne    122c <nicelin+0x10c>
jp     122c <nicelin+0x10c>
xor    %ebx,%ebx
mov    $0x1,%r15d
jmp    1245 <nicelin+0x125>
mulsd  0xdec(%rip),%xmm1
movsd  %xmm1,0x8(%rsp)
mov    $0x1,%r15d
mov    $0x1,%ebx
movapd 0x10(%rsp),%xmm1
cvttsd2si %xmm0,%edx
mov    %rdx,0x38(%rsp)
mov    %cl,%al
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
jbe    1276 <nicelin+0x156>
mulsd  0xdb8(%rip),%xmm1
movapd %xmm1,0x10(%rsp)
mov    $0x1,%r14d
jmp    128f <nicelin+0x16f>
xor    %r14d,%r14d
ucomisd %xmm0,%xmm1
jne    1281 <nicelin+0x161>
jnp    128f <nicelin+0x16f>
divsd  0xd97(%rip),%xmm1
movapd %xmm1,0x10(%rsp)
mov    0x38(%rsp),%rcx
sub    %eax,%ecx
mov    %rcx,0x38(%rsp)
xorps  %xmm0,%xmm0
cvtsi2sd %ebx,%xmm0
movsd  %xmm0,0x30(%rsp)
xorps  %xmm0,%xmm0
cvtsi2sd %r14d,%xmm0
movsd  %xmm0,0x28(%rsp)
neg    %ebx
xor    %r13d,%r13d
nopl   0x0(%rax,%rax,1)
mov    0x38(%rsp),%rax
add    %r13d,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  0xd51(%rip),%xmm0
movsd  %xmm1,0x40(%rsp)
call   1040 <pow@plt>
ucomisd 0xd56(%rip),%xmm0
mov    %ebx,%ecx
mov    %r14d,%eax
jne    12f3 <nicelin+0x1d3>
jnp    131b <nicelin+0x1fb>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
subsd  0x30(%rsp),%xmm1
cvttsd2si %xmm1,%ecx
movapd 0x10(%rsp),%xmm1
divsd  %xmm0,%xmm1
addsd  0x28(%rsp),%xmm1
cvttsd2si %xmm1,%eax
sub    %ecx,%eax
lea    (%rax,%r15,1),%edx
cmp    %ebp,%edx
jle    1450 <nicelin+0x330>
movsd  0xcf7(%rip),%xmm0
movsd  0x40(%rsp),%xmm1
call   1040 <pow@plt>
addsd  %xmm0,%xmm0
ucomisd 0xcf8(%rip),%xmm0
mov    %ebx,%ecx
mov    %r14d,%eax
jne    1351 <nicelin+0x231>
jnp    1379 <nicelin+0x259>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
subsd  0x30(%rsp),%xmm1
cvttsd2si %xmm1,%ecx
movapd 0x10(%rsp),%xmm1
divsd  %xmm0,%xmm1
addsd  0x28(%rsp),%xmm1
cvttsd2si %xmm1,%eax
sub    %ecx,%eax
lea    (%rax,%r15,1),%edx
cmp    %ebp,%edx
jle    1450 <nicelin+0x330>
movsd  0xc99(%rip),%xmm0
movsd  0x40(%rsp),%xmm1
call   1040 <pow@plt>
mulsd  0xc8e(%rip),%xmm0
ucomisd 0xc96(%rip),%xmm0
mov    %ebx,%ecx
mov    %r14d,%eax
jne    13b3 <nicelin+0x293>
jnp    13db <nicelin+0x2bb>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
subsd  0x30(%rsp),%xmm1
cvttsd2si %xmm1,%ecx
movapd 0x10(%rsp),%xmm1
divsd  %xmm0,%xmm1
addsd  0x28(%rsp),%xmm1
cvttsd2si %xmm1,%eax
sub    %ecx,%eax
lea    (%rax,%r15,1),%edx
cmp    %ebp,%edx
jle    1450 <nicelin+0x330>
movsd  0xc3b(%rip),%xmm0
movsd  0x40(%rsp),%xmm1
call   1040 <pow@plt>
mulsd  0xc38(%rip),%xmm0
ucomisd 0xc38(%rip),%xmm0
mov    %ebx,%ecx
mov    %r14d,%eax
jne    1411 <nicelin+0x2f1>
jnp    1439 <nicelin+0x319>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
subsd  0x30(%rsp),%xmm1
cvttsd2si %xmm1,%ecx
movapd 0x10(%rsp),%xmm1
divsd  %xmm0,%xmm1
addsd  0x28(%rsp),%xmm1
cvttsd2si %xmm1,%eax
sub    %ecx,%eax
lea    (%rax,%r15,1),%edx
cmp    %ebp,%edx
jle    1450 <nicelin+0x330>
add    $0x1,%r13d
cmp    %r13d,%ebp
jne    12c0 <nicelin+0x1a0>
test   %eax,%eax
jle    147a <nicelin+0x35a>
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
mulsd  %xmm0,%xmm1
movsd  %xmm1,(%r12)
mov    %eax,%edx
lea    -0x1(%rdx),%rsi
mov    %edx,%ecx
and    $0x3,%ecx
cmp    $0x3,%rsi
jae    1499 <nicelin+0x379>
xor    %esi,%esi
jmp    14d5 <nicelin+0x3b5>
movaps 0x50(%rsp),%xmm0
movsd  %xmm0,(%r12)
movapd 0x60(%rsp),%xmm0
movsd  %xmm0,0x8(%r12)
mov    $0x2,%eax
jmp    1505 <nicelin+0x3e5>
and    $0xfffffffc,%edx
xor    %esi,%esi
xchg   %ax,%ax
addsd  %xmm0,%xmm1
movsd  %xmm1,0x8(%r12,%rsi,8)
addsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%r12,%rsi,8)
addsd  %xmm0,%xmm1
movsd  %xmm1,0x18(%r12,%rsi,8)
addsd  %xmm0,%xmm1
movsd  %xmm1,0x20(%r12,%rsi,8)
add    $0x4,%rsi
cmp    %rsi,%rdx
jne    14a0 <nicelin+0x380>
test   %rcx,%rcx
je     1502 <nicelin+0x3e2>
lea    (%r12,%rsi,8),%rdx
add    $0x8,%rdx
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
addsd  %xmm0,%xmm1
movsd  %xmm1,(%rdx,%rsi,8)
add    $0x1,%rsi
cmp    %rsi,%rcx
jne    14f0 <nicelin+0x3d0>
add    $0x1,%eax
mov    0x48(%rsp),%rdx
mov    %eax,(%rdx)
add    $0x78,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @nicelin(double %0, double %1, i32 %2, double* nocapture %3, i32* nocapture writeonly %4) {
%6 = icmp eq i32 %2, 0
br i1 %6, label %14, label %7
7: ; preds = %5
%8 = fsub double %1, %0
%9 = sitofp i32 %2 to double
%10 = fdiv double %8, %9
%11 = icmp slt i32 %2, 2
%12 = fcmp oeq double %10, 0.000000e+00
%13 = or i1 %11, %12
br i1 %13, label %14, label %16
14: ; preds = %5, %7
%15 = getelementptr inbounds double, double* %3, i64 1
store double %0, double* %15
br label %177
16: ; preds = %7
%17 = fcmp olt double %10, 0.000000e+00
%18 = fneg double %10
%19 = select i1 %17, double %18, double %10
%20 = select i1 %17, double %0, double %1
%21 = select i1 %17, double %1, double %0
%22 = tail call double @log(double %19)
%23 = fdiv double %22, 2.302580e+00
%24 = fptosi double %23 to i32
%25 = fcmp olt double %23, 1.000000e+00
%26 = sext i1 %25 to i32
%27 = add nsw i32 %26, %24
%28 = fcmp ogt double %21, 0.000000e+00
br i1 %28, label %29, label %33
29: ; preds = %16
%30 = fdiv double %21, 9.999000e-01
%31 = icmp ne i32 %2, 3
%32 = zext i1 %31 to i32
br label %37
33: ; preds = %16
%34 = fcmp oeq double %21, 0.000000e+00
br i1 %34, label %37, label %35
35: ; preds = %33
%36 = fmul double %21, 9.999000e-01
br label %37
37: ; preds = %29, %33, %35
%38 = phi i32 [ 1, %35 ], [ %32, %29 ], [ 1, %33 ]
%39 = phi i32 [ 1, %35 ], [ 0, %29 ], [ 0, %33 ]
%40 = phi double [ %36, %35 ], [ %30, %29 ], [ %21, %33 ]
%41 = fcmp ogt double %20, 0.000000e+00
br i1 %41, label %42, label %44
42: ; preds = %37
%43 = fmul double %20, 9.999000e-01
br label %48
44: ; preds = %37
%45 = fcmp oeq double %20, 0.000000e+00
br i1 %45, label %48, label %46
46: ; preds = %44
%47 = fdiv double %20, 9.999000e-01
br label %48
48: ; preds = %42, %46, %44
%49 = phi i32 [ 1, %42 ], [ 0, %46 ], [ 0, %44 ]
%50 = phi double [ %43, %42 ], [ %47, %46 ], [ %20, %44 ]
%51 = sitofp i32 %39 to double
%52 = sitofp i32 %49 to double
%53 = sub nsw i32 0, %39
br label %54
54: ; preds = %48, %111
%55 = phi i32 [ %27, %48 ], [ %112, %111 ]
%56 = phi i32 [ 0, %48 ], [ %113, %111 ]
%57 = sitofp i32 %55 to double
%58 = tail call double @pow(double 1.000000e+01, double %57)
%59 = fcmp oeq double %58, 0.000000e+00
br i1 %59, label %122, label %115
60: ; preds = %122
%61 = tail call double @pow(double 1.000000e+01, double %57)
%62 = fmul double %61, 2.000000e+00
%63 = fcmp oeq double %62, 0.000000e+00
br i1 %63, label %71, label %64
64: ; preds = %60
%65 = fdiv double %40, %62
%66 = fsub double %65, %51
%67 = fptosi double %66 to i32
%68 = fdiv double %50, %62
%69 = fadd double %68, %52
%70 = fptosi double %69 to i32
br label %71
71: ; preds = %64, %60
%72 = phi i32 [ %67, %64 ], [ %53, %60 ]
%73 = phi i32 [ %70, %64 ], [ %49, %60 ]
%74 = sub nsw i32 %73, %72
%75 = add nsw i32 %74, %38
%76 = icmp sgt i32 %75, %2
br i1 %76, label %77, label %128
77: ; preds = %71
%78 = tail call double @pow(double 1.000000e+01, double %57)
%79 = fmul double %78, 2.500000e+00
%80 = fcmp oeq double %79, 0.000000e+00
br i1 %80, label %88, label %81
81: ; preds = %77
%82 = fdiv double %40, %79
%83 = fsub double %82, %51
%84 = fptosi double %83 to i32
%85 = fdiv double %50, %79
%86 = fadd double %85, %52
%87 = fptosi double %86 to i32
br label %88
88: ; preds = %81, %77
%89 = phi i32 [ %84, %81 ], [ %53, %77 ]
%90 = phi i32 [ %87, %81 ], [ %49, %77 ]
%91 = sub nsw i32 %90, %89
%92 = add nsw i32 %91, %38
%93 = icmp sgt i32 %92, %2
br i1 %93, label %94, label %128
94: ; preds = %88
%95 = tail call double @pow(double 1.000000e+01, double %57)
%96 = fmul double %95, 5.000000e+00
%97 = fcmp oeq double %96, 0.000000e+00
br i1 %97, label %105, label %98
98: ; preds = %94
%99 = fdiv double %40, %96
%100 = fsub double %99, %51
%101 = fptosi double %100 to i32
%102 = fdiv double %50, %96
%103 = fadd double %102, %52
%104 = fptosi double %103 to i32
br label %105
105: ; preds = %98, %94
%106 = phi i32 [ %101, %98 ], [ %53, %94 ]
%107 = phi i32 [ %104, %98 ], [ %49, %94 ]
%108 = sub nsw i32 %107, %106
%109 = add nsw i32 %108, %38
%110 = icmp sgt i32 %109, %2
br i1 %110, label %111, label %128
111: ; preds = %105
%112 = add nsw i32 %55, 1
%113 = add nuw nsw i32 %56, 1
%114 = icmp eq i32 %113, %2
br i1 %114, label %128, label %54
115: ; preds = %54
%116 = fdiv double %40, %58
%117 = fsub double %116, %51
%118 = fptosi double %117 to i32
%119 = fdiv double %50, %58
%120 = fadd double %119, %52
%121 = fptosi double %120 to i32
br label %122
122: ; preds = %54, %115
%123 = phi i32 [ %118, %115 ], [ %53, %54 ]
%124 = phi i32 [ %121, %115 ], [ %49, %54 ]
%125 = sub nsw i32 %124, %123
%126 = add nsw i32 %125, %38
%127 = icmp sgt i32 %126, %2
br i1 %127, label %60, label %128
128: ; preds = %111, %122, %71, %88, %105
%129 = phi i32 [ %123, %122 ], [ %72, %71 ], [ %89, %88 ], [ %106, %105 ], [ %106, %111 ]
%130 = phi i32 [ %125, %122 ], [ %74, %71 ], [ %91, %88 ], [ %108, %105 ], [ %108, %111 ]
%131 = phi double [ %58, %122 ], [ %62, %71 ], [ %79, %88 ], [ %96, %105 ], [ %96, %111 ]
%132 = icmp slt i32 %130, 1
br i1 %132, label %133, label %135
133: ; preds = %128
store double %0, double* %3
%134 = getelementptr inbounds double, double* %3, i64 1
store double %1, double* %134
br label %177
135: ; preds = %128
%136 = sitofp i32 %129 to double
%137 = fmul double %131, %136
store double %137, double* %3
%138 = zext i32 %130 to i64
%139 = add nsw i64 %138, -1
%140 = and i64 %138, 3
%141 = icmp ult i64 %139, 3
br i1 %141, label %162, label %142
142: ; preds = %135
%143 = and i64 %138, 4294967292
br label %144
144: ; preds = %144, %142
%145 = phi double [ %137, %142 ], [ %157, %144 ]
%146 = phi i64 [ 0, %142 ], [ %158, %144 ]
%147 = phi i64 [ 0, %142 ], [ %160, %144 ]
%148 = fadd double %131, %145
%149 = or i64 %146, 1
%150 = getelementptr inbounds double, double* %3, i64 %149
store double %148, double* %150
%151 = fadd double %131, %148
%152 = or i64 %146, 2
%153 = getelementptr inbounds double, double* %3, i64 %152
store double %151, double* %153
%154 = fadd double %131, %151
%155 = or i64 %146, 3
%156 = getelementptr inbounds double, double* %3, i64 %155
store double %154, double* %156
%157 = fadd double %131, %154
%158 = add nuw nsw i64 %146, 4
%159 = getelementptr inbounds double, double* %3, i64 %158
store double %157, double* %159
%160 = add i64 %147, 4
%161 = icmp eq i64 %160, %143
br i1 %161, label %162, label %144
162: ; preds = %144, %135
%163 = phi double [ %137, %135 ], [ %157, %144 ]
%164 = phi i64 [ 0, %135 ], [ %158, %144 ]
%165 = icmp eq i64 %140, 0
br i1 %165, label %175, label %166
166: ; preds = %162, %166
%167 = phi double [ %170, %166 ], [ %163, %162 ]
%168 = phi i64 [ %171, %166 ], [ %164, %162 ]
%169 = phi i64 [ %173, %166 ], [ 0, %162 ]
%170 = fadd double %131, %167
%171 = add nuw nsw i64 %168, 1
%172 = getelementptr inbounds double, double* %3, i64 %171
store double %170, double* %172
%173 = add i64 %169, 1
%174 = icmp eq i64 %173, %140
br i1 %174, label %175, label %166
175: ; preds = %166, %162
%176 = add nsw i32 %130, 1
br label %177
177: ; preds = %175, %133, %14
%178 = phi i32 [ %176, %175 ], [ 2, %133 ], [ 2, %14 ]
store i32 %178, i32* %4
ret void
}