#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 */
typedef int uint64_t;

/* Variables and functions */
int UINT64_MAX;
char const *grisu3_encode_double(char const *, char const *, int, int, int, int,
                                 int, double *);
char *grisu3_parse_hex_fp(char const *, char const *, int, double *);
const char *grisu3_parse_double(const char *buf, size_t len, double *result) {
  const char *mark, *k, *end;
  int sign = 0, esign = 0;
  uint64_t fraction = 0;
  int exponent = 0;
  int ee = 0;
  int fraction_exp = 0;
  int ulp_half_error = 0;
  *result = 0.0;
  end = buf + len + 1;
  if (len > 1000) {
    end = buf + 1000 + 1;
  }
  if (buf == end) {
    return buf;
  }
  mark = buf;
  if (*buf == '-') {
    ++buf;
    sign = 1;
    if (buf == end) {
      return 0;
    }
  }
  if (*buf == '0') {
    ++buf;
    if (buf != end && (*buf | 0x20) == 'x') {
      k = grisu3_parse_hex_fp(buf, end, sign, result);
      if (k == buf) {
        return mark;
      }
      return k;
    }
    while (buf != end && *buf == '0') {
      ++buf;
    }
  } else {
    if (*buf < '1' || *buf > '9') {
      return sign ? 0 : mark;
    }
    fraction = (uint64_t)(*buf++ - '0');
  }
  k = buf;
  while (buf != end && *buf >= '0' && *buf <= '9') {
    if (fraction >= UINT64_MAX / 10) {
      fraction += *buf >= '5';
      ulp_half_error = 1;
      break;
    }
    fraction = fraction * 10 + (uint64_t)(*buf++ - '0');
  }
  fraction_exp = (int)(buf - k);
  while (buf != end && *buf == '0') {
    ++exponent;
    ++buf;
  }
  if (buf != end && *buf >= '1' && *buf <= '9') {
    ulp_half_error = 1;
    ++exponent;
    ++buf;
    while (buf != end && *buf >= '0' && *buf <= '9') {
      ++exponent;
      ++buf;
    }
  }
  if (buf != end && *buf == '.') {
    ++buf;
    k = buf;
    if (*buf < '0' || *buf > '9') {
      return 0;
    }
    while (buf != end && *buf >= '0' && *buf <= '9') {
      if (fraction >= UINT64_MAX / 10) {
        if (!ulp_half_error) {
          fraction += *buf >= '5';
          ulp_half_error = 1;
        }
        break;
      }
      fraction = fraction * 10 + (uint64_t)(*buf++ - '0');
      --exponent;
    }
    fraction_exp += (int)(buf - k);
    while (buf != end && *buf == '0') {
      ++exponent;
      ++buf;
    }
    if (buf != end && *buf >= '1' && *buf <= '9') {
      ulp_half_error = 1;
      ++buf;
      while (buf != end && *buf >= '0' && *buf <= '9') {
        ++buf;
      }
    }
  }
  exponent += fraction_exp;
  if (buf != end && (*buf | 0x20) == 'e') {
    if (end - buf < 2) {
      return 0;
    }
    ++buf;
    if (*buf == '+') {
      ++buf;
      if (buf == end) {
        return 0;
      }
    } else if (*buf == '-') {
      esign = 1;
      ++buf;
      if (buf == end) {
        return 0;
      }
    }
    if (*buf < '0' || *buf > '9') {
      return 0;
    }
    ee = *buf++ - '0';
    while (buf != end && *buf >= '0' && *buf <= '9') {
      if (ee <= 0x7fff) {
        ee = ee * 10 + *buf - '0';
      }
      ++buf;
    }
  }
  exponent = exponent + (esign ? -ee : ee);
  if (buf == end) {
    return 0;
  }
  return grisu3_encode_double(mark, buf, sign, fraction, exponent, fraction_exp,
                              ulp_half_error, result);
}


x86 assembly (clang, -O0):
<grisu3_parse_double>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x20(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
add    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x3e8,-0x18(%rbp)
jbe    11a3 <grisu3_parse_double+0x83>
mov    -0x10(%rbp),%rax
add    $0x3e8,%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
jne    11be <grisu3_parse_double+0x9e>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1209 <grisu3_parse_double+0xe9>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
movl   $0x1,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
jne    1204 <grisu3_parse_double+0xe4>
movq   $0x0,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
jmp    1209 <grisu3_parse_double+0xe9>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    12d4 <grisu3_parse_double+0x1b4>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
je     1286 <grisu3_parse_double+0x166>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
or     $0x20,%eax
cmp    $0x78,%eax
jne    1286 <grisu3_parse_double+0x166>
mov    -0x10(%rbp),%rdi
mov    -0x38(%rbp),%rsi
mov    -0x3c(%rbp),%edx
mov    -0x20(%rbp),%rcx
call   1040 <grisu3_parse_hex_fp@plt>
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x10(%rbp),%rax
jne    1279 <grisu3_parse_double+0x159>
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
jmp    128b <grisu3_parse_double+0x16b>
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x55(%rbp)
je     12ae <grisu3_parse_double+0x18e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
sete   %al
mov    %al,-0x55(%rbp)
mov    -0x55(%rbp),%al
test   $0x1,%al
jne    12be <grisu3_parse_double+0x19e>
jmp    12cf <grisu3_parse_double+0x1af>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    128b <grisu3_parse_double+0x16b>
jmp    1336 <grisu3_parse_double+0x216>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x31,%eax
jl     12f4 <grisu3_parse_double+0x1d4>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    131e <grisu3_parse_double+0x1fe>
cmpl   $0x0,-0x3c(%rbp)
je     1309 <grisu3_parse_double+0x1e9>
xor    %eax,%eax
mov    %rax,-0x60(%rbp)
jmp    1311 <grisu3_parse_double+0x1f1>
mov    -0x28(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x60(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x44(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x61(%rbp)
je     1376 <grisu3_parse_double+0x256>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x61(%rbp)
jl     1376 <grisu3_parse_double+0x256>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x61(%rbp)
mov    -0x61(%rbp),%al
test   $0x1,%al
jne    1386 <grisu3_parse_double+0x266>
jmp    13f1 <grisu3_parse_double+0x2d1>
mov    -0x44(%rbp),%eax
mov    %eax,-0x68(%rbp)
mov    0x2c45(%rip),%rax
mov    (%rax),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x68(%rbp),%eax
cmp    %ecx,%eax
jl     13ce <grisu3_parse_double+0x2ae>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x35,%eax
setge  %al
and    $0x1,%al
movzbl %al,%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
movl   $0x1,-0x54(%rbp)
jmp    13f1 <grisu3_parse_double+0x2d1>
imul   $0xa,-0x44(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
movsbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x44(%rbp)
jmp    133e <grisu3_parse_double+0x21e>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x50(%rbp)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x69(%rbp)
je     1422 <grisu3_parse_double+0x302>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
sete   %al
mov    %al,-0x69(%rbp)
mov    -0x69(%rbp),%al
test   $0x1,%al
jne    1432 <grisu3_parse_double+0x312>
jmp    144c <grisu3_parse_double+0x32c>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    13ff <grisu3_parse_double+0x2df>
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
je     14fd <grisu3_parse_double+0x3dd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x31,%eax
jl     14fd <grisu3_parse_double+0x3dd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     14fd <grisu3_parse_double+0x3dd>
movl   $0x1,-0x54(%rbp)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x6a(%rbp)
je     14ce <grisu3_parse_double+0x3ae>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x6a(%rbp)
jl     14ce <grisu3_parse_double+0x3ae>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x6a(%rbp)
mov    -0x6a(%rbp),%al
test   $0x1,%al
jne    14de <grisu3_parse_double+0x3be>
jmp    14f8 <grisu3_parse_double+0x3d8>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1496 <grisu3_parse_double+0x376>
jmp    14fd <grisu3_parse_double+0x3dd>
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
je     1729 <grisu3_parse_double+0x609>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1729 <grisu3_parse_double+0x609>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     154f <grisu3_parse_double+0x42f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    155c <grisu3_parse_double+0x43c>
movq   $0x0,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
jmp    1561 <grisu3_parse_double+0x441>
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x6b(%rbp)
je     1599 <grisu3_parse_double+0x479>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x6b(%rbp)
jl     1599 <grisu3_parse_double+0x479>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x6b(%rbp)
mov    -0x6b(%rbp),%al
test   $0x1,%al
jne    15a9 <grisu3_parse_double+0x489>
jmp    1627 <grisu3_parse_double+0x507>
mov    -0x44(%rbp),%eax
mov    %eax,-0x70(%rbp)
mov    0x2a22(%rip),%rax
mov    (%rax),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x70(%rbp),%eax
cmp    %ecx,%eax
jl     15fb <grisu3_parse_double+0x4db>
cmpl   $0x0,-0x54(%rbp)
jne    15f6 <grisu3_parse_double+0x4d6>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x35,%eax
setge  %al
and    $0x1,%al
movzbl %al,%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
movl   $0x1,-0x54(%rbp)
jmp    1627 <grisu3_parse_double+0x507>
imul   $0xa,-0x44(%rbp),%eax
mov    -0x10(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
movsbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x44(%rbp)
mov    -0x48(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x48(%rbp)
jmp    1561 <grisu3_parse_double+0x441>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
add    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x71(%rbp)
je     165b <grisu3_parse_double+0x53b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
sete   %al
mov    %al,-0x71(%rbp)
mov    -0x71(%rbp),%al
test   $0x1,%al
jne    166b <grisu3_parse_double+0x54b>
jmp    1685 <grisu3_parse_double+0x565>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1638 <grisu3_parse_double+0x518>
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
je     1724 <grisu3_parse_double+0x604>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x31,%eax
jl     1724 <grisu3_parse_double+0x604>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     1724 <grisu3_parse_double+0x604>
movl   $0x1,-0x54(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x72(%rbp)
je     16fe <grisu3_parse_double+0x5de>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x72(%rbp)
jl     16fe <grisu3_parse_double+0x5de>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x72(%rbp)
mov    -0x72(%rbp),%al
test   $0x1,%al
jne    170e <grisu3_parse_double+0x5ee>
jmp    171f <grisu3_parse_double+0x5ff>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    16c6 <grisu3_parse_double+0x5a6>
jmp    1724 <grisu3_parse_double+0x604>
jmp    1729 <grisu3_parse_double+0x609>
mov    -0x50(%rbp),%eax
add    -0x48(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
je     18c8 <grisu3_parse_double+0x7a8>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
or     $0x20,%eax
cmp    $0x65,%eax
jne    18c8 <grisu3_parse_double+0x7a8>
mov    -0x38(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
cmp    $0x2,%rax
jge    1775 <grisu3_parse_double+0x655>
movq   $0x0,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    17bd <grisu3_parse_double+0x69d>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
jne    17b8 <grisu3_parse_double+0x698>
movq   $0x0,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
jmp    1805 <grisu3_parse_double+0x6e5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1800 <grisu3_parse_double+0x6e0>
movl   $0x1,-0x40(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
jne    17fb <grisu3_parse_double+0x6db>
movq   $0x0,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
jmp    1800 <grisu3_parse_double+0x6e0>
jmp    1805 <grisu3_parse_double+0x6e5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     1825 <grisu3_parse_double+0x705>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    1832 <grisu3_parse_double+0x712>
movq   $0x0,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x73(%rbp)
je     1882 <grisu3_parse_double+0x762>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x73(%rbp)
jl     1882 <grisu3_parse_double+0x762>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x73(%rbp)
mov    -0x73(%rbp),%al
test   $0x1,%al
jne    1892 <grisu3_parse_double+0x772>
jmp    18c3 <grisu3_parse_double+0x7a3>
cmpl   $0x7fff,-0x4c(%rbp)
jg     18b2 <grisu3_parse_double+0x792>
imul   $0xa,-0x4c(%rbp),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    184a <grisu3_parse_double+0x72a>
jmp    18c8 <grisu3_parse_double+0x7a8>
mov    -0x48(%rbp),%eax
mov    %eax,-0x78(%rbp)
cmpl   $0x0,-0x40(%rbp)
je     18e5 <grisu3_parse_double+0x7c5>
xor    %eax,%eax
sub    -0x4c(%rbp),%eax
mov    %eax,-0x7c(%rbp)
jmp    18eb <grisu3_parse_double+0x7cb>
mov    -0x4c(%rbp),%eax
mov    %eax,-0x7c(%rbp)
mov    -0x78(%rbp),%eax
mov    -0x7c(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x38(%rbp),%rax
jne    1911 <grisu3_parse_double+0x7f1>
movq   $0x0,-0x8(%rbp)
jmp    1941 <grisu3_parse_double+0x821>
mov    -0x28(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x3c(%rbp),%edx
mov    -0x44(%rbp),%ecx
mov    -0x48(%rbp),%r8d
mov    -0x50(%rbp),%r9d
mov    -0x54(%rbp),%r10d
mov    -0x20(%rbp),%rax
mov    %r10d,(%rsp)
mov    %rax,0x8(%rsp)
call   1030 <grisu3_encode_double@plt>
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<grisu3_parse_double>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rdi,%r14
movq   $0x0,(%rdx)
cmp    $0x3e8,%rsi
mov    $0x3e8,%r13d
cmovb  %rsi,%r13
lea    (%rdi,%r13,1),%rsi
add    $0x1,%rsi
cmp    %rdi,%rsi
je     149a <grisu3_parse_double+0x37a>
mov    %rdx,%r10
mov    (%r14),%cl
xor    %edx,%edx
mov    %ecx,%ebp
mov    %r14,%rax
cmp    $0x2d,%cl
jne    117e <grisu3_parse_double+0x5e>
test   %r13,%r13
je     1497 <grisu3_parse_double+0x377>
lea    0x1(%r14),%rax
mov    (%rax),%bpl
mov    $0x1,%edx
add    %r14,%r13
cmp    $0x30,%bpl
jne    11b6 <grisu3_parse_double+0x96>
lea    0x1(%rax),%r15
xor    %ecx,%ecx
cmp    %r13,%rax
je     1206 <grisu3_parse_double+0xe6>
mov    (%r15),%dil
mov    %edi,%ebx
and    $0xdf,%bl
cmp    $0x58,%bl
jne    11dd <grisu3_parse_double+0xbd>
mov    %r15,%rdi
mov    %r10,%rcx
call   1040 <grisu3_parse_hex_fp@plt>
cmp    %r15,%rax
cmovne %rax,%r14
jmp    149a <grisu3_parse_double+0x37a>
lea    -0x3a(%rbp),%edi
cmp    $0xf6,%dil
ja     11cd <grisu3_parse_double+0xad>
xor    %eax,%eax
cmp    $0x2d,%cl
cmove  %rax,%r14
jmp    149a <grisu3_parse_double+0x37a>
movsbl %bpl,%ecx
add    $0x1,%rax
add    $0xffffffd0,%ecx
mov    %rax,%r15
jmp    1206 <grisu3_parse_double+0xe6>
cmp    $0x30,%dil
jne    1206 <grisu3_parse_double+0xe6>
add    $0x2,%rax
nopw   0x0(%rax,%rax,1)
mov    %rax,%r15
add    $0xffffffffffffffff,%rax
cmp    %r13,%rax
je     1206 <grisu3_parse_double+0xe6>
lea    0x1(%r15),%rax
cmpb   $0x30,(%r15)
je     11f0 <grisu3_parse_double+0xd0>
cmp    %rsi,%r15
je     1497 <grisu3_parse_double+0x377>
mov    0x2dc2(%rip),%r8
movslq (%r8),%rax
imul   $0x66666667,%rax,%rbp
mov    %rbp,%rax
shr    $0x3f,%rax
sar    $0x22,%rbp
add    %eax,%ebp
mov    %r15,%rax
movsbl (%rax),%edi
lea    -0x30(%rdi),%ebx
xor    %r11d,%r11d
cmp    $0x9,%bl
ja     1261 <grisu3_parse_double+0x141>
cmp    %ebp,%ecx
jge    126e <grisu3_parse_double+0x14e>
lea    (%rcx,%rcx,4),%ecx
lea    0x1(%rax),%rbx
lea    (%rdi,%rcx,2),%ecx
add    $0xffffffd0,%ecx
cmp    %r13,%rax
mov    %rbx,%rax
jne    1230 <grisu3_parse_double+0x110>
cmp    %rsi,%rbx
jne    1287 <grisu3_parse_double+0x167>
jmp    1497 <grisu3_parse_double+0x377>
mov    %rax,%rbx
cmp    %rsi,%rbx
jne    1287 <grisu3_parse_double+0x167>
jmp    1497 <grisu3_parse_double+0x377>
cmp    $0x35,%dil
sbb    $0xffffffff,%ecx
mov    $0x1,%r11d
mov    %rax,%rbx
cmp    %rsi,%rbx
je     1497 <grisu3_parse_double+0x377>
mov    %ebx,%r9d
sub    %r15d,%r9d
mov    $0x1,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl (%rbx),%eax
cmp    $0x30,%al
jne    12be <grisu3_parse_double+0x19e>
lea    0x1(%rbx),%rax
add    $0x1,%ebp
cmp    %r13,%rbx
mov    %rax,%rbx
jne    12a0 <grisu3_parse_double+0x180>
add    $0xffffffff,%ebp
mov    %rax,%rbx
jmp    12fb <grisu3_parse_double+0x1db>
add    $0xcf,%al
cmp    $0x8,%al
ja     12f8 <grisu3_parse_double+0x1d8>
add    $0x1,%rbx
mov    %rbx,%rdi
nopl   0x0(%rax,%rax,1)
mov    %rdi,%rbx
mov    %ebp,%r15d
lea    -0x1(%rdi),%rax
mov    $0x1,%r11d
cmp    %r13,%rax
je     12fe <grisu3_parse_double+0x1de>
movzbl (%rbx),%eax
add    $0xd0,%al
lea    0x1(%rbx),%rdi
lea    0x1(%r15),%ebp
cmp    $0xa,%al
jb     12d0 <grisu3_parse_double+0x1b0>
jmp    12fe <grisu3_parse_double+0x1de>
add    $0xffffffff,%ebp
mov    %ebp,%r15d
cmp    %rsi,%rbx
je     1497 <grisu3_parse_double+0x377>
cmpb   $0x2e,(%rbx)
jne    1412 <grisu3_parse_double+0x2f2>
mov    0x1(%rbx),%r12b
lea    -0x3a(%r12),%eax
cmp    $0xf6,%al
jb     1497 <grisu3_parse_double+0x377>
lea    0x1(%rbx),%rbp
cmp    %r13,%rbx
je     1399 <grisu3_parse_double+0x279>
lea    -0x30(%r12),%edi
cmp    $0x9,%dil
ja     1399 <grisu3_parse_double+0x279>
mov    %rbp,(%rsp)
movslq (%r8),%rdi
imul   $0x66666667,%rdi,%r8
mov    %r8,%rdi
shr    $0x3f,%rdi
sar    $0x22,%r8
add    %edi,%r8d
add    $0x2,%rbx
neg    %r15d
mov    %r15d,%edi
mov    %rbx,%rbp
mov    %rbp,%rbx
mov    %edi,%r15d
add    $0xffffffffffffffff,%rbp
cmp    %r8d,%ecx
jge    139e <grisu3_parse_double+0x27e>
movsbl %r12b,%edi
lea    (%rcx,%rcx,4),%ecx
lea    (%rdi,%rcx,2),%ecx
add    $0xffffffd0,%ecx
cmp    %r13,%rbp
je     1394 <grisu3_parse_double+0x274>
movzbl (%rbx),%r12d
lea    -0x30(%r12),%eax
lea    0x1(%rbx),%rbp
lea    0x1(%r15),%edi
cmp    $0xa,%al
jb     135e <grisu3_parse_double+0x23e>
not    %r15d
jmp    13b6 <grisu3_parse_double+0x296>
mov    %rbp,%rbx
jmp    13ba <grisu3_parse_double+0x29a>
neg    %r15d
test   %r11d,%r11d
mov    $0x1,%r11d
jne    13b3 <grisu3_parse_double+0x293>
cmp    $0x35,%r12b
sbb    $0xffffffff,%ecx
mov    %rbp,%rbx
mov    (%rsp),%rbp
cmp    %rsi,%rbx
je     1497 <grisu3_parse_double+0x377>
mov    %ebx,%eax
sub    %ebp,%eax
add    %eax,%r9d
movzbl (%rbx),%eax
cmp    $0x30,%al
jne    13e6 <grisu3_parse_double+0x2c6>
add    $0x1,%r15d
lea    0x1(%rbx),%rax
cmp    %r13,%rbx
mov    %rax,%rbx
jne    13ca <grisu3_parse_double+0x2aa>
mov    %rax,%rbx
jmp    1412 <grisu3_parse_double+0x2f2>
add    $0xcf,%al
cmp    $0x8,%al
ja     1412 <grisu3_parse_double+0x2f2>
add    $0x1,%rbx
mov    %rbx,%rdi
mov    %rdi,%rbx
lea    -0x1(%rdi),%rax
mov    $0x1,%r11d
cmp    %r13,%rax
je     1412 <grisu3_parse_double+0x2f2>
movzbl (%rbx),%eax
add    $0xd0,%al
lea    0x1(%rbx),%rdi
cmp    $0xa,%al
jb     13f3 <grisu3_parse_double+0x2d3>
xor    %edi,%edi
cmp    %rsi,%rbx
je     1497 <grisu3_parse_double+0x377>
mov    (%rbx),%al
and    $0xdf,%al
cmp    $0x45,%al
jne    1447 <grisu3_parse_double+0x327>
mov    %rsi,%rax
sub    %rbx,%rax
xor    %edi,%edi
cmp    $0x2,%rax
jl     1497 <grisu3_parse_double+0x377>
mov    0x1(%rbx),%al
cmp    $0x2d,%al
je     1476 <grisu3_parse_double+0x356>
cmp    $0x2b,%al
jne    1486 <grisu3_parse_double+0x366>
add    $0x2,%rbx
xor    %edi,%edi
cmp    %rsi,%rbx
jne    148a <grisu3_parse_double+0x36a>
jmp    1497 <grisu3_parse_double+0x377>
xor    %r12d,%r12d
cmp    %rsi,%rbx
je     1497 <grisu3_parse_double+0x377>
add    %r9d,%r15d
mov    %r12d,%r8d
neg    %r8d
test   %edi,%edi
cmove  %r12d,%r8d
add    %r15d,%r8d
mov    %r14,%rdi
mov    %rbx,%rsi
push   %r10
push   %r11
call   1030 <grisu3_encode_double@plt>
add    $0x18,%rsp
jmp    14a1 <grisu3_parse_double+0x381>
add    $0x2,%rbx
mov    $0x1,%edi
cmp    %rsi,%rbx
jne    148a <grisu3_parse_double+0x36a>
jmp    1497 <grisu3_parse_double+0x377>
add    $0x1,%rbx
movzbl (%rbx),%r12d
lea    -0x3a(%r12),%eax
cmp    $0xf6,%al
jae    14ac <grisu3_parse_double+0x38c>
xor    %r14d,%r14d
mov    %r14,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
add    $0xffffffd0,%r12d
lea    0x1(%rbx),%rbp
cmp    %r13,%rbx
je     14e8 <grisu3_parse_double+0x3c8>
mov    %rdi,%r8
movzbl 0x0(%rbp),%edi
lea    -0x30(%rdi),%eax
cmp    $0x9,%al
ja     14f0 <grisu3_parse_double+0x3d0>
cmp    $0x8000,%r12d
lea    (%r12,%r12,4),%eax
lea    -0x30(%rdi,%rax,2),%eax
cmovl  %eax,%r12d
lea    0x1(%rbp),%rbx
cmp    %r13,%rbp
mov    %rbx,%rbp
jne    14bc <grisu3_parse_double+0x39c>
jmp    14f3 <grisu3_parse_double+0x3d3>
mov    %rbp,%rbx
jmp    144a <grisu3_parse_double+0x32a>
mov    %rbp,%rbx
mov    %r8,%rdi
jmp    144a <grisu3_parse_double+0x32a>

LLVM IR (-O0):
@UINT64_MAX = global i32 0
define i8* @grisu3_parse_double(i8* %0, i64 %1, double* %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i64
%7 = alloca double*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
store i8* %0, i8** %5
store i64 %1, i64* %6
store double* %2, double** %7
store i32 0, i32* %11
store i32 0, i32* %12
store i32 0, i32* %13
store i32 0, i32* %14
store i32 0, i32* %15
store i32 0, i32* %16
store i32 0, i32* %17
%18 = load double*, double** %7
store double 0.000000e+00, double* %18
%19 = load i8*, i8** %5
%20 = load i64, i64* %6
%21 = getelementptr inbounds i8, i8* %19, i64 %20
%22 = getelementptr inbounds i8, i8* %21, i64 1
store i8* %22, i8** %10
%23 = load i64, i64* %6
%24 = icmp ugt i64 %23, 1000
br i1 %24, label %25, label %29
25: ; preds = %3
%26 = load i8*, i8** %5
%27 = getelementptr inbounds i8, i8* %26, i64 1000
%28 = getelementptr inbounds i8, i8* %27, i64 1
store i8* %28, i8** %10
br label %29
29: ; preds = %25, %3
%30 = load i8*, i8** %5
%31 = load i8*, i8** %10
%32 = icmp eq i8* %30, %31
br i1 %32, label %33, label %35
33: ; preds = %29
%34 = load i8*, i8** %5
store i8* %34, i8** %4
br label %478
35: ; preds = %29
%36 = load i8*, i8** %5
store i8* %36, i8** %8
%37 = load i8*, i8** %5
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 45
br i1 %40, label %41, label %49
41: ; preds = %35
%42 = load i8*, i8** %5
%43 = getelementptr inbounds i8, i8* %42, i32 1
store i8* %43, i8** %5
store i32 1, i32* %11
%44 = load i8*, i8** %5
%45 = load i8*, i8** %10
%46 = icmp eq i8* %44, %45
br i1 %46, label %47, label %48
47: ; preds = %41
store i8* null, i8** %4
br label %478
48: ; preds = %41
br label %49
49: ; preds = %48, %35
%50 = load i8*, i8** %5
%51 = load i8, i8* %50
%52 = sext i8 %51 to i32
%53 = icmp eq i32 %52, 48
br i1 %53, label %54, label %95
54: ; preds = %49
%55 = load i8*, i8** %5
%56 = getelementptr inbounds i8, i8* %55, i32 1
store i8* %56, i8** %5
%57 = load i8*, i8** %5
%58 = load i8*, i8** %10
%59 = icmp ne i8* %57, %58
br i1 %59, label %60, label %79
60: ; preds = %54
%61 = load i8*, i8** %5
%62 = load i8, i8* %61
%63 = sext i8 %62 to i32
%64 = or i32 %63, 32
%65 = icmp eq i32 %64, 120
br i1 %65, label %66, label %79
66: ; preds = %60
%67 = load i8*, i8** %5
%68 = load i8*, i8** %10
%69 = load i32, i32* %11
%70 = load double*, double** %7
%71 = call i8* @grisu3_parse_hex_fp(i8* %67, i8* %68, i32 %69, double* %70)
store i8* %71, i8** %9
%72 = load i8*, i8** %9
%73 = load i8*, i8** %5
%74 = icmp eq i8* %72, %73
br i1 %74, label %75, label %77
75: ; preds = %66
%76 = load i8*, i8** %8
store i8* %76, i8** %4
br label %478
77: ; preds = %66
%78 = load i8*, i8** %9
store i8* %78, i8** %4
br label %478
79: ; preds = %60, %54
br label %80
80: ; preds = %91, %79
%81 = load i8*, i8** %5
%82 = load i8*, i8** %10
%83 = icmp ne i8* %81, %82
br i1 %83, label %84, label %89
84: ; preds = %80
%85 = load i8*, i8** %5
%86 = load i8, i8* %85
%87 = sext i8 %86 to i32
%88 = icmp eq i32 %87, 48
br label %89
89: ; preds = %84, %80
%90 = phi i1 [ false, %80 ], [ %88, %84 ]
br i1 %90, label %91, label %94
91: ; preds = %89
%92 = load i8*, i8** %5
%93 = getelementptr inbounds i8, i8* %92, i32 1
store i8* %93, i8** %5
br label %80
94: ; preds = %89
br label %119
95: ; preds = %49
%96 = load i8*, i8** %5
%97 = load i8, i8* %96
%98 = sext i8 %97 to i32
%99 = icmp slt i32 %98, 49
br i1 %99, label %105, label %100
100: ; preds = %95
%101 = load i8*, i8** %5
%102 = load i8, i8* %101
%103 = sext i8 %102 to i32
%104 = icmp sgt i32 %103, 57
br i1 %104, label %105, label %113
105: ; preds = %100, %95
%106 = load i32, i32* %11
%107 = icmp ne i32 %106, 0
br i1 %107, label %108, label %109
108: ; preds = %105
br label %111
109: ; preds = %105
%110 = load i8*, i8** %8
br label %111
111: ; preds = %109, %108
%112 = phi i8* [ null, %108 ], [ %110, %109 ]
store i8* %112, i8** %4
br label %478
113: ; preds = %100
%114 = load i8*, i8** %5
%115 = getelementptr inbounds i8, i8* %114, i32 1
store i8* %115, i8** %5
%116 = load i8, i8* %114
%117 = sext i8 %116 to i32
%118 = sub nsw i32 %117, 48
store i32 %118, i32* %13
br label %119
119: ; preds = %113, %94
%120 = load i8*, i8** %5
store i8* %120, i8** %9
br label %121
121: ; preds = %150, %119
%122 = load i8*, i8** %5
%123 = load i8*, i8** %10
%124 = icmp ne i8* %122, %123
br i1 %124, label %125, label %135
125: ; preds = %121
%126 = load i8*, i8** %5
%127 = load i8, i8* %126
%128 = sext i8 %127 to i32
%129 = icmp sge i32 %128, 48
br i1 %129, label %130, label %135
130: ; preds = %125
%131 = load i8*, i8** %5
%132 = load i8, i8* %131
%133 = sext i8 %132 to i32
%134 = icmp sle i32 %133, 57
br label %135
135: ; preds = %130, %125, %121
%136 = phi i1 [ false, %125 ], [ false, %121 ], [ %134, %130 ]
br i1 %136, label %137, label %159
137: ; preds = %135
%138 = load i32, i32* %13
%139 = load i32, i32* @UINT64_MAX
%140 = sdiv i32 %139, 10
%141 = icmp sge i32 %138, %140
br i1 %141, label %142, label %150
142: ; preds = %137
%143 = load i8*, i8** %5
%144 = load i8, i8* %143
%145 = sext i8 %144 to i32
%146 = icmp sge i32 %145, 53
%147 = zext i1 %146 to i32
%148 = load i32, i32* %13
%149 = add nsw i32 %148, %147
store i32 %149, i32* %13
store i32 1, i32* %17
br label %159
150: ; preds = %137
%151 = load i32, i32* %13
%152 = mul nsw i32 %151, 10
%153 = load i8*, i8** %5
%154 = getelementptr inbounds i8, i8* %153, i32 1
store i8* %154, i8** %5
%155 = load i8, i8* %153
%156 = sext i8 %155 to i32
%157 = sub nsw i32 %156, 48
%158 = add nsw i32 %152, %157
store i32 %158, i32* %13
br label %121
159: ; preds = %142, %135
%160 = load i8*, i8** %5
%161 = load i8*, i8** %9
%162 = ptrtoint i8* %160 to i64
%163 = ptrtoint i8* %161 to i64
%164 = sub i64 %162, %163
%165 = trunc i64 %164 to i32
store i32 %165, i32* %16
br label %166
166: ; preds = %177, %159
%167 = load i8*, i8** %5
%168 = load i8*, i8** %10
%169 = icmp ne i8* %167, %168
br i1 %169, label %170, label %175
170: ; preds = %166
%171 = load i8*, i8** %5
%172 = load i8, i8* %171
%173 = sext i8 %172 to i32
%174 = icmp eq i32 %173, 48
br label %175
175: ; preds = %170, %166
%176 = phi i1 [ false, %166 ], [ %174, %170 ]
br i1 %176, label %177, label %182
177: ; preds = %175
%178 = load i32, i32* %14
%179 = add nsw i32 %178, 1
store i32 %179, i32* %14
%180 = load i8*, i8** %5
%181 = getelementptr inbounds i8, i8* %180, i32 1
store i8* %181, i8** %5
br label %166
182: ; preds = %175
%183 = load i8*, i8** %5
%184 = load i8*, i8** %10
%185 = icmp ne i8* %183, %184
br i1 %185, label %186, label %223
186: ; preds = %182
%187 = load i8*, i8** %5
%188 = load i8, i8* %187
%189 = sext i8 %188 to i32
%190 = icmp sge i32 %189, 49
br i1 %190, label %191, label %223
191: ; preds = %186
%192 = load i8*, i8** %5
%193 = load i8, i8* %192
%194 = sext i8 %193 to i32
%195 = icmp sle i32 %194, 57
br i1 %195, label %196, label %223
196: ; preds = %191
store i32 1, i32* %17
%197 = load i32, i32* %14
%198 = add nsw i32 %197, 1
store i32 %198, i32* %14
%199 = load i8*, i8** %5
%200 = getelementptr inbounds i8, i8* %199, i32 1
store i8* %200, i8** %5
br label %201
201: ; preds = %217, %196
%202 = load i8*, i8** %5
%203 = load i8*, i8** %10
%204 = icmp ne i8* %202, %203
br i1 %204, label %205, label %215
205: ; preds = %201
%206 = load i8*, i8** %5
%207 = load i8, i8* %206
%208 = sext i8 %207 to i32
%209 = icmp sge i32 %208, 48
br i1 %209, label %210, label %215
210: ; preds = %205
%211 = load i8*, i8** %5
%212 = load i8, i8* %211
%213 = sext i8 %212 to i32
%214 = icmp sle i32 %213, 57
br label %215
215: ; preds = %210, %205, %201
%216 = phi i1 [ false, %205 ], [ false, %201 ], [ %214, %210 ]
br i1 %216, label %217, label %222
217: ; preds = %215
%218 = load i32, i32* %14
%219 = add nsw i32 %218, 1
store i32 %219, i32* %14
%220 = load i8*, i8** %5
%221 = getelementptr inbounds i8, i8* %220, i32 1
store i8* %221, i8** %5
br label %201
222: ; preds = %215
br label %223
223: ; preds = %222, %191, %186, %182
%224 = load i8*, i8** %5
%225 = load i8*, i8** %10
%226 = icmp ne i8* %224, %225
br i1 %226, label %227, label %354
227: ; preds = %223
%228 = load i8*, i8** %5
%229 = load i8, i8* %228
%230 = sext i8 %229 to i32
%231 = icmp eq i32 %230, 46
br i1 %231, label %232, label %354
232: ; preds = %227
%233 = load i8*, i8** %5
%234 = getelementptr inbounds i8, i8* %233, i32 1
store i8* %234, i8** %5
%235 = load i8*, i8** %5
store i8* %235, i8** %9
%236 = load i8*, i8** %5
%237 = load i8, i8* %236
%238 = sext i8 %237 to i32
%239 = icmp slt i32 %238, 48
br i1 %239, label %245, label %240
240: ; preds = %232
%241 = load i8*, i8** %5
%242 = load i8, i8* %241
%243 = sext i8 %242 to i32
%244 = icmp sgt i32 %243, 57
br i1 %244, label %245, label %246
245: ; preds = %240, %232
store i8* null, i8** %4
br label %478
246: ; preds = %240
br label %247
247: ; preds = %280, %246
%248 = load i8*, i8** %5
%249 = load i8*, i8** %10
%250 = icmp ne i8* %248, %249
br i1 %250, label %251, label %261
251: ; preds = %247
%252 = load i8*, i8** %5
%253 = load i8, i8* %252
%254 = sext i8 %253 to i32
%255 = icmp sge i32 %254, 48
br i1 %255, label %256, label %261
256: ; preds = %251
%257 = load i8*, i8** %5
%258 = load i8, i8* %257
%259 = sext i8 %258 to i32
%260 = icmp sle i32 %259, 57
br label %261
261: ; preds = %256, %251, %247
%262 = phi i1 [ false, %251 ], [ false, %247 ], [ %260, %256 ]
br i1 %262, label %263, label %291
263: ; preds = %261
%264 = load i32, i32* %13
%265 = load i32, i32* @UINT64_MAX
%266 = sdiv i32 %265, 10
%267 = icmp sge i32 %264, %266
br i1 %267, label %268, label %280
268: ; preds = %263
%269 = load i32, i32* %17
%270 = icmp ne i32 %269, 0
br i1 %270, label %279, label %271
271: ; preds = %268
%272 = load i8*, i8** %5
%273 = load i8, i8* %272
%274 = sext i8 %273 to i32
%275 = icmp sge i32 %274, 53
%276 = zext i1 %275 to i32
%277 = load i32, i32* %13
%278 = add nsw i32 %277, %276
store i32 %278, i32* %13
store i32 1, i32* %17
br label %279
279: ; preds = %271, %268
br label %291
280: ; preds = %263
%281 = load i32, i32* %13
%282 = mul nsw i32 %281, 10
%283 = load i8*, i8** %5
%284 = getelementptr inbounds i8, i8* %283, i32 1
store i8* %284, i8** %5
%285 = load i8, i8* %283
%286 = sext i8 %285 to i32
%287 = sub nsw i32 %286, 48
%288 = add nsw i32 %282, %287
store i32 %288, i32* %13
%289 = load i32, i32* %14
%290 = add nsw i32 %289, -1
store i32 %290, i32* %14
br label %247
291: ; preds = %279, %261
%292 = load i8*, i8** %5
%293 = load i8*, i8** %9
%294 = ptrtoint i8* %292 to i64
%295 = ptrtoint i8* %293 to i64
%296 = sub i64 %294, %295
%297 = trunc i64 %296 to i32
%298 = load i32, i32* %16
%299 = add nsw i32 %298, %297
store i32 %299, i32* %16
br label %300
300: ; preds = %311, %291
%301 = load i8*, i8** %5
%302 = load i8*, i8** %10
%303 = icmp ne i8* %301, %302
br i1 %303, label %304, label %309
304: ; preds = %300
%305 = load i8*, i8** %5
%306 = load i8, i8* %305
%307 = sext i8 %306 to i32
%308 = icmp eq i32 %307, 48
br label %309
309: ; preds = %304, %300
%310 = phi i1 [ false, %300 ], [ %308, %304 ]
br i1 %310, label %311, label %316
311: ; preds = %309
%312 = load i32, i32* %14
%313 = add nsw i32 %312, 1
store i32 %313, i32* %14
%314 = load i8*, i8** %5
%315 = getelementptr inbounds i8, i8* %314, i32 1
store i8* %315, i8** %5
br label %300
316: ; preds = %309
%317 = load i8*, i8** %5
%318 = load i8*, i8** %10
%319 = icmp ne i8* %317, %318
br i1 %319, label %320, label %353
320: ; preds = %316
%321 = load i8*, i8** %5
%322 = load i8, i8* %321
%323 = sext i8 %322 to i32
%324 = icmp sge i32 %323, 49
br i1 %324, label %325, label %353
325: ; preds = %320
%326 = load i8*, i8** %5
%327 = load i8, i8* %326
%328 = sext i8 %327 to i32
%329 = icmp sle i32 %328, 57
br i1 %329, label %330, label %353
330: ; preds = %325
store i32 1, i32* %17
%331 = load i8*, i8** %5
%332 = getelementptr inbounds i8, i8* %331, i32 1
store i8* %332, i8** %5
br label %333
333: ; preds = %349, %330
%334 = load i8*, i8** %5
%335 = load i8*, i8** %10
%336 = icmp ne i8* %334, %335
br i1 %336, label %337, label %347
337: ; preds = %333
%338 = load i8*, i8** %5
%339 = load i8, i8* %338
%340 = sext i8 %339 to i32
%341 = icmp sge i32 %340, 48
br i1 %341, label %342, label %347
342: ; preds = %337
%343 = load i8*, i8** %5
%344 = load i8, i8* %343
%345 = sext i8 %344 to i32
%346 = icmp sle i32 %345, 57
br label %347
347: ; preds = %342, %337, %333
%348 = phi i1 [ false, %337 ], [ false, %333 ], [ %346, %342 ]
br i1 %348, label %349, label %352
349: ; preds = %347
%350 = load i8*, i8** %5
%351 = getelementptr inbounds i8, i8* %350, i32 1
store i8* %351, i8** %5
br label %333
352: ; preds = %347
br label %353
353: ; preds = %352, %325, %320, %316
br label %354
354: ; preds = %353, %227, %223
%355 = load i32, i32* %16
%356 = load i32, i32* %14
%357 = add nsw i32 %356, %355
store i32 %357, i32* %14
%358 = load i8*, i8** %5
%359 = load i8*, i8** %10
%360 = icmp ne i8* %358, %359
br i1 %360, label %361, label %452
361: ; preds = %354
%362 = load i8*, i8** %5
%363 = load i8, i8* %362
%364 = sext i8 %363 to i32
%365 = or i32 %364, 32
%366 = icmp eq i32 %365, 101
br i1 %366, label %367, label %452
367: ; preds = %361
%368 = load i8*, i8** %10
%369 = load i8*, i8** %5
%370 = ptrtoint i8* %368 to i64
%371 = ptrtoint i8* %369 to i64
%372 = sub i64 %370, %371
%373 = icmp slt i64 %372, 2
br i1 %373, label %374, label %375
374: ; preds = %367
store i8* null, i8** %4
br label %478
375: ; preds = %367
%376 = load i8*, i8** %5
%377 = getelementptr inbounds i8, i8* %376, i32 1
store i8* %377, i8** %5
%378 = load i8*, i8** %5
%379 = load i8, i8* %378
%380 = sext i8 %379 to i32
%381 = icmp eq i32 %380, 43
br i1 %381, label %382, label %390
382: ; preds = %375
%383 = load i8*, i8** %5
%384 = getelementptr inbounds i8, i8* %383, i32 1
store i8* %384, i8** %5
%385 = load i8*, i8** %5
%386 = load i8*, i8** %10
%387 = icmp eq i8* %385, %386
br i1 %387, label %388, label %389
388: ; preds = %382
store i8* null, i8** %4
br label %478
389: ; preds = %382
br label %404
390: ; preds = %375
%391 = load i8*, i8** %5
%392 = load i8, i8* %391
%393 = sext i8 %392 to i32
%394 = icmp eq i32 %393, 45
br i1 %394, label %395, label %403
395: ; preds = %390
store i32 1, i32* %12
%396 = load i8*, i8** %5
%397 = getelementptr inbounds i8, i8* %396, i32 1
store i8* %397, i8** %5
%398 = load i8*, i8** %5
%399 = load i8*, i8** %10
%400 = icmp eq i8* %398, %399
br i1 %400, label %401, label %402
401: ; preds = %395
store i8* null, i8** %4
br label %478
402: ; preds = %395
br label %403
403: ; preds = %402, %390
br label %404
404: ; preds = %403, %389
%405 = load i8*, i8** %5
%406 = load i8, i8* %405
%407 = sext i8 %406 to i32
%408 = icmp slt i32 %407, 48
br i1 %408, label %414, label %409
409: ; preds = %404
%410 = load i8*, i8** %5
%411 = load i8, i8* %410
%412 = sext i8 %411 to i32
%413 = icmp sgt i32 %412, 57
br i1 %413, label %414, label %415
414: ; preds = %409, %404
store i8* null, i8** %4
br label %478
415: ; preds = %409
%416 = load i8*, i8** %5
%417 = getelementptr inbounds i8, i8* %416, i32 1
store i8* %417, i8** %5
%418 = load i8, i8* %416
%419 = sext i8 %418 to i32
%420 = sub nsw i32 %419, 48
store i32 %420, i32* %15
br label %421
421: ; preds = %448, %415
%422 = load i8*, i8** %5
%423 = load i8*, i8** %10
%424 = icmp ne i8* %422, %423
br i1 %424, label %425, label %435
425: ; preds = %421
%426 = load i8*, i8** %5
%427 = load i8, i8* %426
%428 = sext i8 %427 to i32
%429 = icmp sge i32 %428, 48
br i1 %429, label %430, label %435
430: ; preds = %425
%431 = load i8*, i8** %5
%432 = load i8, i8* %431
%433 = sext i8 %432 to i32
%434 = icmp sle i32 %433, 57
br label %435
435: ; preds = %430, %425, %421
%436 = phi i1 [ false, %425 ], [ false, %421 ], [ %434, %430 ]
br i1 %436, label %437, label %451
437: ; preds = %435
%438 = load i32, i32* %15
%439 = icmp sle i32 %438, 32767
br i1 %439, label %440, label %448
440: ; preds = %437
%441 = load i32, i32* %15
%442 = mul nsw i32 %441, 10
%443 = load i8*, i8** %5
%444 = load i8, i8* %443
%445 = sext i8 %444 to i32
%446 = add nsw i32 %442, %445
%447 = sub nsw i32 %446, 48
store i32 %447, i32* %15
br label %448
448: ; preds = %440, %437
%449 = load i8*, i8** %5
%450 = getelementptr inbounds i8, i8* %449, i32 1
store i8* %450, i8** %5
br label %421
451: ; preds = %435
br label %452
452: ; preds = %451, %361, %354
%453 = load i32, i32* %14
%454 = load i32, i32* %12
%455 = icmp ne i32 %454, 0
br i1 %455, label %456, label %459
456: ; preds = %452
%457 = load i32, i32* %15
%458 = sub nsw i32 0, %457
br label %461
459: ; preds = %452
%460 = load i32, i32* %15
br label %461
461: ; preds = %459, %456
%462 = phi i32 [ %458, %456 ], [ %460, %459 ]
%463 = add nsw i32 %453, %462
store i32 %463, i32* %14
%464 = load i8*, i8** %5
%465 = load i8*, i8** %10
%466 = icmp eq i8* %464, %465
br i1 %466, label %467, label %468
467: ; preds = %461
store i8* null, i8** %4
br label %478
468: ; preds = %461
%469 = load i8*, i8** %8
%470 = load i8*, i8** %5
%471 = load i32, i32* %11
%472 = load i32, i32* %13
%473 = load i32, i32* %14
%474 = load i32, i32* %16
%475 = load i32, i32* %17
%476 = load double*, double** %7
%477 = call i8* @grisu3_encode_double(i8* %469, i8* %470, i32 %471, i32 %472, i32 %473, i32 %474, i32 %475, double* %476)
store i8* %477, i8** %4
br label %478
478: ; preds = %468, %467, %414, %401, %388, %374, %245, %111, %77, %75, %47, %33
%479 = load i8*, i8** %4
ret i8* %479
}

LLVM IR (-O2):
@UINT64_MAX = global i32 0
define i8* @grisu3_parse_double(i8* %0, i64 %1, double* %2) {
store double 0.000000e+00, double* %2
%4 = icmp ult i64 %1, 1000
%5 = select i1 %4, i64 %1, i64 1000
%6 = getelementptr inbounds i8, i8* %0, i64 %5
%7 = getelementptr inbounds i8, i8* %6, i64 1
%8 = icmp eq i8* %7, %0
br i1 %8, label %246, label %9
9: ; preds = %3
%10 = load i8, i8* %0
%11 = icmp eq i8 %10, 45
br i1 %11, label %12, label %17
12: ; preds = %9
%13 = getelementptr inbounds i8, i8* %0, i64 1
%14 = icmp eq i64 %5, 0
br i1 %14, label %246, label %15
15: ; preds = %12
%16 = load i8, i8* %13
br label %17
17: ; preds = %15, %9
%18 = phi i8 [ %16, %15 ], [ %10, %9 ]
%19 = phi i8* [ %13, %15 ], [ %0, %9 ]
%20 = phi i32 [ 1, %15 ], [ 0, %9 ]
%21 = sext i8 %18 to i32
%22 = icmp eq i8 %18, 48
br i1 %22, label %23, label %43
23: ; preds = %17
%24 = getelementptr inbounds i8, i8* %19, i64 1
%25 = icmp eq i8* %19, %6
br i1 %25, label %51, label %26
26: ; preds = %23
%27 = load i8, i8* %24
%28 = and i8 %27, -33
%29 = icmp eq i8 %28, 88
br i1 %29, label %32, label %30
30: ; preds = %26
%31 = icmp eq i8 %27, 48
br i1 %31, label %39, label %51
32: ; preds = %26
%33 = tail call i8* @grisu3_parse_hex_fp(i8* %24, i8* %7, i32 %20, double* %2)
%34 = icmp eq i8* %33, %24
%35 = select i1 %34, i8* %0, i8* %33
br label %246
36: ; preds = %39
%37 = load i8, i8* %41
%38 = icmp eq i8 %37, 48
br i1 %38, label %39, label %51
39: ; preds = %30, %36
%40 = phi i8* [ %41, %36 ], [ %24, %30 ]
%41 = getelementptr inbounds i8, i8* %40, i64 1
%42 = icmp eq i8* %40, %6
br i1 %42, label %51, label %36
43: ; preds = %17
%44 = add i8 %18, -58
%45 = icmp ult i8 %44, -9
br i1 %45, label %46, label %48
46: ; preds = %43
%47 = select i1 %11, i8* null, i8* %0
br label %246
48: ; preds = %43
%49 = getelementptr inbounds i8, i8* %19, i64 1
%50 = add nsw i32 %21, -48
br label %51
51: ; preds = %36, %39, %30, %23, %48
%52 = phi i8* [ %49, %48 ], [ %24, %23 ], [ %24, %30 ], [ %41, %39 ], [ %41, %36 ]
%53 = phi i32 [ %50, %48 ], [ 0, %23 ], [ 0, %30 ], [ 0, %39 ], [ 0, %36 ]
%54 = icmp eq i8* %52, %7
br i1 %54, label %246, label %55
55: ; preds = %51
%56 = load i32, i32* @UINT64_MAX
%57 = sdiv i32 %56, 10
br label %58
58: ; preds = %55, %71
%59 = phi i32 [ %53, %55 ], [ %75, %71 ]
%60 = phi i8* [ %52, %55 ], [ %73, %71 ]
%61 = load i8, i8* %60
%62 = sext i8 %61 to i32
%63 = add i8 %61, -48
%64 = icmp ult i8 %63, 10
br i1 %64, label %65, label %77
65: ; preds = %58
%66 = icmp slt i32 %59, %57
br i1 %66, label %71, label %67
67: ; preds = %65
%68 = icmp ugt i8 %61, 52
%69 = zext i1 %68 to i32
%70 = add nsw i32 %59, %69
br label %77
71: ; preds = %65
%72 = mul nsw i32 %59, 10
%73 = getelementptr inbounds i8, i8* %60, i64 1
%74 = add i32 %72, -48
%75 = add i32 %74, %62
%76 = icmp eq i8* %60, %6
br i1 %76, label %77, label %58
77: ; preds = %58, %71, %67
%78 = phi i8* [ %60, %67 ], [ %60, %58 ], [ %73, %71 ]
%79 = phi i32 [ %70, %67 ], [ %59, %58 ], [ %75, %71 ]
%80 = phi i32 [ 1, %67 ], [ 0, %71 ], [ 0, %58 ]
%81 = ptrtoint i8* %78 to i64
%82 = ptrtoint i8* %52 to i64
%83 = sub i64 %81, %82
%84 = trunc i64 %83 to i32
%85 = icmp eq i8* %78, %7
br i1 %85, label %246, label %86
86: ; preds = %77, %91
%87 = phi i32 [ %92, %91 ], [ 0, %77 ]
%88 = phi i8* [ %93, %91 ], [ %78, %77 ]
%89 = load i8, i8* %88
%90 = icmp eq i8 %89, 48
br i1 %90, label %91, label %95
91: ; preds = %86
%92 = add nuw nsw i32 %87, 1
%93 = getelementptr inbounds i8, i8* %88, i64 1
%94 = icmp eq i8* %88, %6
br i1 %94, label %108, label %86
95: ; preds = %86
%96 = add i8 %89, -49
%97 = icmp ult i8 %96, 9
br i1 %97, label %98, label %108
98: ; preds = %95, %104
%99 = phi i8* [ %101, %104 ], [ %88, %95 ]
%100 = phi i32 [ %102, %104 ], [ %87, %95 ]
%101 = getelementptr inbounds i8, i8* %99, i64 1
%102 = add nuw nsw i32 %100, 1
%103 = icmp eq i8* %99, %6
br i1 %103, label %108, label %104
104: ; preds = %98
%105 = load i8, i8* %101
%106 = add i8 %105, -48
%107 = icmp ult i8 %106, 10
br i1 %107, label %98, label %108
108: ; preds = %91, %104, %98, %95
%109 = phi i8* [ %88, %95 ], [ %101, %98 ], [ %101, %104 ], [ %93, %91 ]
%110 = phi i32 [ %87, %95 ], [ %102, %98 ], [ %102, %104 ], [ %92, %91 ]
%111 = phi i32 [ %80, %95 ], [ 1, %98 ], [ 1, %104 ], [ %80, %91 ]
%112 = icmp eq i8* %109, %7
br i1 %112, label %246, label %113
113: ; preds = %108
%114 = load i8, i8* %109
%115 = icmp eq i8 %114, 46
br i1 %115, label %116, label %183
116: ; preds = %113
%117 = getelementptr inbounds i8, i8* %109, i64 1
%118 = load i8, i8* %117
%119 = add i8 %118, -58
%120 = icmp ult i8 %119, -10
br i1 %120, label %246, label %121
121: ; preds = %116
%122 = icmp eq i8* %109, %6
br i1 %122, label %152, label %123
123: ; preds = %121
%124 = load i32, i32* @UINT64_MAX
%125 = sdiv i32 %124, 10
%126 = add i8 %118, -48
%127 = icmp ult i8 %126, 10
br i1 %127, label %128, label %152
128: ; preds = %123, %148
%129 = phi i8* [ %143, %148 ], [ %117, %123 ]
%130 = phi i32 [ %145, %148 ], [ %79, %123 ]
%131 = phi i32 [ %146, %148 ], [ %110, %123 ]
%132 = phi i8 [ %149, %148 ], [ %118, %123 ]
%133 = icmp slt i32 %130, %125
br i1 %133, label %140, label %134
134: ; preds = %128
%135 = icmp eq i32 %111, 0
br i1 %135, label %136, label %152
136: ; preds = %134
%137 = icmp ugt i8 %132, 52
%138 = zext i1 %137 to i32
%139 = add nsw i32 %130, %138
br label %152
140: ; preds = %128
%141 = sext i8 %132 to i32
%142 = mul nsw i32 %130, 10
%143 = getelementptr inbounds i8, i8* %129, i64 1
%144 = add i32 %142, -48
%145 = add i32 %144, %141
%146 = add nsw i32 %131, -1
%147 = icmp eq i8* %129, %6
br i1 %147, label %152, label %148
148: ; preds = %140
%149 = load i8, i8* %143
%150 = add i8 %149, -48
%151 = icmp ult i8 %150, 10
br i1 %151, label %128, label %152
152: ; preds = %140, %148, %123, %121, %134, %136
%153 = phi i8* [ %129, %134 ], [ %129, %136 ], [ %117, %121 ], [ %117, %123 ], [ %143, %148 ], [ %143, %140 ]
%154 = phi i32 [ %131, %134 ], [ %131, %136 ], [ %110, %121 ], [ %110, %123 ], [ %146, %148 ], [ %146, %140 ]
%155 = phi i32 [ %130, %134 ], [ %139, %136 ], [ %79, %121 ], [ %79, %123 ], [ %145, %148 ], [ %145, %140 ]
%156 = phi i32 [ 1, %134 ], [ 1, %136 ], [ %111, %121 ], [ %111, %123 ], [ %111, %148 ], [ %111, %140 ]
%157 = ptrtoint i8* %153 to i64
%158 = ptrtoint i8* %117 to i64
%159 = sub i64 %157, %158
%160 = trunc i64 %159 to i32
%161 = add nsw i32 %160, %84
%162 = icmp eq i8* %153, %7
br i1 %162, label %246, label %163
163: ; preds = %152, %168
%164 = phi i32 [ %169, %168 ], [ %154, %152 ]
%165 = phi i8* [ %170, %168 ], [ %153, %152 ]
%166 = load i8, i8* %165
%167 = icmp eq i8 %166, 48
br i1 %167, label %168, label %172
168: ; preds = %163
%169 = add nsw i32 %164, 1
%170 = getelementptr inbounds i8, i8* %165, i64 1
%171 = icmp eq i8* %165, %6
br i1 %171, label %183, label %163
172: ; preds = %163
%173 = add i8 %166, -49
%174 = icmp ult i8 %173, 9
br i1 %174, label %175, label %183
175: ; preds = %172, %179
%176 = phi i8* [ %177, %179 ], [ %165, %172 ]
%177 = getelementptr inbounds i8, i8* %176, i64 1
%178 = icmp eq i8* %176, %6
br i1 %178, label %183, label %179
179: ; preds = %175
%180 = load i8, i8* %177
%181 = add i8 %180, -48
%182 = icmp ult i8 %181, 10
br i1 %182, label %175, label %183
183: ; preds = %168, %175, %179, %172, %113
%184 = phi i8* [ %165, %172 ], [ %109, %113 ], [ %177, %179 ], [ %177, %175 ], [ %170, %168 ]
%185 = phi i32 [ %155, %172 ], [ %79, %113 ], [ %155, %179 ], [ %155, %175 ], [ %155, %168 ]
%186 = phi i32 [ %164, %172 ], [ %110, %113 ], [ %164, %179 ], [ %164, %175 ], [ %169, %168 ]
%187 = phi i32 [ %161, %172 ], [ %84, %113 ], [ %161, %179 ], [ %161, %175 ], [ %161, %168 ]
%188 = phi i32 [ %156, %172 ], [ %111, %113 ], [ 1, %179 ], [ 1, %175 ], [ %156, %168 ]
%189 = add nsw i32 %187, %186
%190 = icmp eq i8* %184, %7
br i1 %190, label %246, label %191
191: ; preds = %183
%192 = load i8, i8* %184
%193 = and i8 %192, -33
%194 = icmp eq i8 %193, 69
br i1 %194, label %195, label %235
195: ; preds = %191
%196 = ptrtoint i8* %7 to i64
%197 = ptrtoint i8* %184 to i64
%198 = sub i64 %196, %197
%199 = icmp slt i64 %198, 2
br i1 %199, label %246, label %200
200: ; preds = %195
%201 = getelementptr inbounds i8, i8* %184, i64 1
%202 = load i8, i8* %201
switch i8 %202, label %209 [
i8 43, label %203
i8 45, label %206
]
203: ; preds = %200
%204 = getelementptr inbounds i8, i8* %184, i64 2
%205 = icmp eq i8* %204, %7
br i1 %205, label %246, label %209
206: ; preds = %200
%207 = getelementptr inbounds i8, i8* %184, i64 2
%208 = icmp eq i8* %207, %7
br i1 %208, label %246, label %209
209: ; preds = %200, %206, %203
%210 = phi i8* [ %204, %203 ], [ %207, %206 ], [ %201, %200 ]
%211 = phi i32 [ 0, %203 ], [ 1, %206 ], [ 0, %200 ]
%212 = load i8, i8* %210
%213 = add i8 %212, -58
%214 = icmp ult i8 %213, -10
br i1 %214, label %246, label %215
215: ; preds = %209
%216 = zext i8 %212 to i32
%217 = add nsw i32 %216, -48
%218 = getelementptr inbounds i8, i8* %210, i64 1
%219 = icmp eq i8* %210, %6
br i1 %219, label %235, label %220
220: ; preds = %215, %226
%221 = phi i8* [ %233, %226 ], [ %218, %215 ]
%222 = phi i32 [ %232, %226 ], [ %217, %215 ]
%223 = load i8, i8* %221
%224 = add i8 %223, -48
%225 = icmp ult i8 %224, 10
br i1 %225, label %226, label %235
226: ; preds = %220
%227 = zext i8 %223 to i32
%228 = icmp slt i32 %222, 32768
%229 = mul nsw i32 %222, 10
%230 = add i32 %229, -48
%231 = add i32 %230, %227
%232 = select i1 %228, i32 %231, i32 %222
%233 = getelementptr inbounds i8, i8* %221, i64 1
%234 = icmp eq i8* %221, %6
br i1 %234, label %235, label %220
235: ; preds = %226, %220, %215, %191
%236 = phi i8* [ %184, %191 ], [ %218, %215 ], [ %233, %226 ], [ %221, %220 ]
%237 = phi i32 [ 0, %191 ], [ %211, %215 ], [ %211, %220 ], [ %211, %226 ]
%238 = phi i32 [ 0, %191 ], [ %217, %215 ], [ %232, %226 ], [ %222, %220 ]
%239 = icmp eq i8* %236, %7
br i1 %239, label %246, label %240
240: ; preds = %235
%241 = icmp eq i32 %237, 0
%242 = sub nsw i32 0, %238
%243 = select i1 %241, i32 %238, i32 %242
%244 = add nsw i32 %189, %243
%245 = tail call i8* @grisu3_encode_double(i8* %0, i8* %236, i32 %20, i32 %185, i32 %244, i32 %187, i32 %188, double* %2)
br label %246
246: ; preds = %51, %77, %152, %108, %183, %235, %209, %206, %203, %195, %116, %32, %12, %3, %240, %46
%247 = phi i8* [ %245, %240 ], [ %47, %46 ], [ %0, %3 ], [ null, %12 ], [ %35, %32 ], [ null, %116 ], [ null, %195 ], [ null, %203 ], [ null, %206 ], [ null, %209 ], [ null, %235 ], [ null, %183 ], [ null, %108 ], [ null, %152 ], [ null, %77 ], [ null, %51 ]
ret i8* %247
}