#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 uint8_t;
struct in6_addr {
  int dummy;
};
typedef int /*<<< orphan*/ ipstr;
typedef int /*<<< orphan*/ ipbin1;
typedef int /*<<< orphan*/ ipbin0;

/* Variables and functions */
int /*<<< orphan*/ AF_INET6;
int INET6_ADDRSTRLEN;
int inet_pton(int /*<<< orphan*/, char *, struct in6_addr *);
scalar_t__ isspace(int);
scalar_t__ isxdigit(int);
int /*<<< orphan*/ memcmp(struct in6_addr *, struct in6_addr *, int);
int /*<<< orphan*/ memcpy(int *, struct in6_addr *, int);
int /*<<< orphan*/ memset(int *, int, int);
int sscanf(char const *, char *, size_t *, int *);
int /*<<< orphan*/ *strchr(char *, char const);
int cvtv6(uint8_t fill, const char *ip, uint8_t *buf) {
  char ipstr[INET6_ADDRSTRLEN];
  struct in6_addr ipbin0, ipbin1;
  size_t i, j;
  size_t prefix_len;
  int consumed;
  if (ip == NULL || buf == NULL)
    return -1;
  for (i = 0; ip[i] != '\0' && isspace((int)(unsigned char)ip[i]); ++i)
    ;
  j = 0;
  for (; ip[i] != '\0' && j + 1 < sizeof(ipstr) &&
         (isxdigit((int)(unsigned char)ip[i]) || strchr(":.", ip[i]) != NULL);
       ++i) {
    ipstr[j++] = ip[i];
  }
  ipstr[j] = '\0';
  if (inet_pton(AF_INET6, ipstr, &ipbin0) != 1)
    return -1;
  for (; ip[i] != '\0' && isspace((int)(unsigned char)ip[i]); ++i)
    ;
  switch (ip[i]) {
  case '\0':
    memcpy(buf, &ipbin0, sizeof(ipbin0));
    return 0;
  case '/':
    memcpy(buf, &ipbin0, sizeof(ipbin0));
    for (++i; ip[i] != '\0' && isspace((int)(unsigned char)ip[i]); ++i)
      ;
    if (sscanf(&ip[i], "%zu%n", &prefix_len, &consumed) < 1)
      return -1;
    if (prefix_len > sizeof(ipbin0) * 8)
      return -1;
    for (i += consumed; ip[i] != '\0' && isspace((int)(unsigned char)ip[i]);
         ++i)
      ;
    if (ip[i] != '\0')
      return -1;
    if (fill == 0x00) {
      if (prefix_len % 8 != 0) {
        buf[prefix_len / 8] &= 0xFF << (8 - prefix_len % 8);
        j = prefix_len / 8 + 1;
      } else {
        j = prefix_len / 8;
      }
      memset(&buf[j], 0, sizeof(ipbin0) - j);
    } else if (fill == 0xFF) {
      if (prefix_len % 8 != 0) {
        buf[prefix_len / 8] |= 0xFF >> (prefix_len % 8);
        j = prefix_len / 8 + 1;
      } else {
        j = prefix_len / 8;
      }
      memset(&buf[j], 0xFF, sizeof(ipbin0) - j);
    } else {
      return -1;
    }
    return 0;
  case '-':
    for (++i; ip[i] != '\0' && isspace((int)(unsigned char)ip[i]); ++i)
      ;
    j = 0;
    for (; ip[i] != '\0' && j + 1 < sizeof(ipstr) &&
           (isxdigit((int)(unsigned char)ip[i]) || strchr(":.", ip[i]) != NULL);
         ++i) {
      ipstr[j++] = ip[i];
    }
    ipstr[j] = '\0';
    if (inet_pton(AF_INET6, ipstr, &ipbin1) != 1)
      return -1;
    for (; ip[i] != '\0' && isspace((int)(unsigned char)ip[i]); ++i)
      ;
    if (ip[i] != '\0')
      return -1;
    if (memcmp(&ipbin0, &ipbin1, sizeof(ipbin0)) > 0)
      return -1;
    if (fill == 0x00) {
      memcpy(buf, &ipbin0, sizeof(ipbin0));
    } else if (fill == 0xFF) {
      memcpy(buf, &ipbin1, sizeof(ipbin1));
    } else {
      return -1;
    }
    return 0;
  default:
    return -1;
  }
}


x86 assembly (clang, -O0):
<cvtv6>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    0x2e4b(%rip),%rax
mov    (%rax),%eax
mov    %rax,-0x68(%rbp)
mov    %rsp,%rcx
mov    %rcx,-0x20(%rbp)
mov    %rax,%rdx
add    $0xf,%rdx
and    $0xfffffffffffffff0,%rdx
mov    %rsp,%rcx
sub    %rdx,%rcx
mov    %rcx,-0x60(%rbp)
mov    %rcx,%rsp
mov    %rax,-0x28(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     11dc <cvtv6+0x5c>
cmpq   $0x0,-0x18(%rbp)
jne    11ef <cvtv6+0x6f>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
movq   $0x0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x69(%rbp)
je     122c <cvtv6+0xac>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzbl (%rax,%rcx,1),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x69(%rbp)
mov    -0x69(%rbp),%al
test   $0x1,%al
jne    123c <cvtv6+0xbc>
jmp    1252 <cvtv6+0xd2>
jmp    1241 <cvtv6+0xc1>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    11f7 <cvtv6+0x77>
movq   $0x0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x6a(%rbp)
je     12d9 <cvtv6+0x159>
mov    -0x68(%rbp),%rdx
mov    -0x48(%rbp),%rcx
add    $0x1,%rcx
xor    %eax,%eax
cmp    %rdx,%rcx
mov    %al,-0x6a(%rbp)
jae    12d9 <cvtv6+0x159>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzbl (%rax,%rcx,1),%edi
call   10a0 <isxdigit@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x6b(%rbp)
jne    12d3 <cvtv6+0x153>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
lea    0xd40(%rip),%rdi
movsbl (%rax,%rcx,1),%esi
call   1030 <strchr@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x6b(%rbp)
mov    -0x6b(%rbp),%al
mov    %al,-0x6a(%rbp)
mov    -0x6a(%rbp),%al
test   $0x1,%al
jne    12e9 <cvtv6+0x169>
jmp    131b <cvtv6+0x19b>
mov    -0x60(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x40(%rbp),%rdx
mov    (%rcx,%rdx,1),%dl
mov    -0x48(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x48(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    125a <cvtv6+0xda>
mov    -0x60(%rbp),%rsi
mov    -0x48(%rbp),%rax
movb   $0x0,(%rsi,%rax,1)
mov    0x2cb2(%rip),%rax
mov    (%rax),%edi
lea    -0x30(%rbp),%rdx
call   1080 <inet_pton@plt>
cmp    $0x1,%eax
je     1355 <cvtv6+0x1d5>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
jmp    135a <cvtv6+0x1da>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x6c(%rbp)
je     138f <cvtv6+0x20f>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzbl (%rax,%rcx,1),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x6c(%rbp)
mov    -0x6c(%rbp),%al
test   $0x1,%al
jne    139f <cvtv6+0x21f>
jmp    13b5 <cvtv6+0x235>
jmp    13a4 <cvtv6+0x224>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    135a <cvtv6+0x1da>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x70(%rbp)
test   %eax,%eax
je     13f3 <cvtv6+0x273>
jmp    13d1 <cvtv6+0x251>
mov    -0x70(%rbp),%eax
sub    $0x2d,%eax
je     16bb <cvtv6+0x53b>
jmp    13e2 <cvtv6+0x262>
mov    -0x70(%rbp),%eax
sub    $0x2f,%eax
je     1418 <cvtv6+0x298>
jmp    194b <cvtv6+0x7cb>
mov    -0x18(%rbp),%rdi
lea    -0x30(%rbp),%rsi
mov    $0x4,%edx
call   1070 <memcpy@plt>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
mov    -0x18(%rbp),%rdi
lea    -0x30(%rbp),%rsi
mov    $0x4,%edx
call   1070 <memcpy@plt>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x71(%rbp)
je     146b <cvtv6+0x2eb>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzbl (%rax,%rcx,1),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x71(%rbp)
mov    -0x71(%rbp),%al
test   $0x1,%al
jne    147b <cvtv6+0x2fb>
jmp    1491 <cvtv6+0x311>
jmp    1480 <cvtv6+0x300>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1436 <cvtv6+0x2b6>
mov    -0x10(%rbp),%rdi
add    -0x40(%rbp),%rdi
lea    0xb63(%rip),%rsi
lea    -0x50(%rbp),%rdx
lea    -0x54(%rbp),%rcx
call   1090 <sscanf@plt>
cmp    $0x1,%eax
jge    14c9 <cvtv6+0x349>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
cmpq   $0x20,-0x50(%rbp)
jbe    14e7 <cvtv6+0x367>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
movslq -0x54(%rbp),%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x72(%rbp)
je     1528 <cvtv6+0x3a8>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzbl (%rax,%rcx,1),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x72(%rbp)
mov    -0x72(%rbp),%al
test   $0x1,%al
jne    1538 <cvtv6+0x3b8>
jmp    154e <cvtv6+0x3ce>
jmp    153d <cvtv6+0x3bd>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    14f3 <cvtv6+0x373>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1576 <cvtv6+0x3f6>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
cmpl   $0x0,-0x8(%rbp)
jne    1604 <cvtv6+0x484>
mov    -0x50(%rbp),%rax
and    $0x7,%rax
cmp    $0x0,%rax
je     15d2 <cvtv6+0x452>
mov    -0x50(%rbp),%rcx
and    $0x7,%rcx
mov    $0x8,%eax
sub    %rcx,%rax
mov    %eax,%ecx
mov    $0xff,%edx
shl    %cl,%edx
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
shr    $0x3,%rcx
and    (%rax,%rcx,4),%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x50(%rbp),%rax
shr    $0x3,%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    15de <cvtv6+0x45e>
mov    -0x50(%rbp),%rax
shr    $0x3,%rax
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%rdi
mov    -0x48(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rdi
mov    $0x4,%eax
sub    -0x48(%rbp),%rax
mov    %eax,%edx
xor    %esi,%esi
call   1040 <memset@plt>
jmp    16a8 <cvtv6+0x528>
cmpl   $0xff,-0x8(%rbp)
jne    1690 <cvtv6+0x510>
mov    -0x50(%rbp),%rax
and    $0x7,%rax
cmp    $0x0,%rax
je     165b <cvtv6+0x4db>
mov    -0x50(%rbp),%rax
and    $0x7,%rax
mov    %eax,%ecx
mov    $0xff,%edx
sar    %cl,%edx
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
shr    $0x3,%rcx
or     (%rax,%rcx,4),%edx
mov    %edx,(%rax,%rcx,4)
mov    -0x50(%rbp),%rax
shr    $0x3,%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    1667 <cvtv6+0x4e7>
mov    -0x50(%rbp),%rax
shr    $0x3,%rax
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%rdi
mov    -0x48(%rbp),%rax
shl    $0x2,%rax
add    %rax,%rdi
mov    $0x4,%eax
sub    -0x48(%rbp),%rax
mov    %eax,%edx
mov    $0xff,%esi
call   1040 <memset@plt>
jmp    16a3 <cvtv6+0x523>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
jmp    16a8 <cvtv6+0x528>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x73(%rbp)
je     16fc <cvtv6+0x57c>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzbl (%rax,%rcx,1),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x73(%rbp)
mov    -0x73(%rbp),%al
test   $0x1,%al
jne    170c <cvtv6+0x58c>
jmp    1722 <cvtv6+0x5a2>
jmp    1711 <cvtv6+0x591>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    16c7 <cvtv6+0x547>
movq   $0x0,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x74(%rbp)
je     17a9 <cvtv6+0x629>
mov    -0x68(%rbp),%rdx
mov    -0x48(%rbp),%rcx
add    $0x1,%rcx
xor    %eax,%eax
cmp    %rdx,%rcx
mov    %al,-0x74(%rbp)
jae    17a9 <cvtv6+0x629>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzbl (%rax,%rcx,1),%edi
call   10a0 <isxdigit@plt>
mov    %rax,%rcx
mov    $0x1,%al
cmp    $0x0,%rcx
mov    %al,-0x75(%rbp)
jne    17a3 <cvtv6+0x623>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
lea    0x870(%rip),%rdi
movsbl (%rax,%rcx,1),%esi
call   1030 <strchr@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x75(%rbp)
mov    -0x75(%rbp),%al
mov    %al,-0x74(%rbp)
mov    -0x74(%rbp),%al
test   $0x1,%al
jne    17b9 <cvtv6+0x639>
jmp    17eb <cvtv6+0x66b>
mov    -0x60(%rbp),%rax
mov    -0x10(%rbp),%rcx
mov    -0x40(%rbp),%rdx
mov    (%rcx,%rdx,1),%dl
mov    -0x48(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x48(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    172a <cvtv6+0x5aa>
mov    -0x60(%rbp),%rsi
mov    -0x48(%rbp),%rax
movb   $0x0,(%rsi,%rax,1)
mov    0x27e2(%rip),%rax
mov    (%rax),%edi
lea    -0x38(%rbp),%rdx
call   1080 <inet_pton@plt>
cmp    $0x1,%eax
je     1825 <cvtv6+0x6a5>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
jmp    182a <cvtv6+0x6aa>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x76(%rbp)
je     185f <cvtv6+0x6df>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movzbl (%rax,%rcx,1),%edi
call   1050 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x76(%rbp)
mov    -0x76(%rbp),%al
test   $0x1,%al
jne    186f <cvtv6+0x6ef>
jmp    1885 <cvtv6+0x705>
jmp    1874 <cvtv6+0x6f4>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    182a <cvtv6+0x6aa>
mov    -0x10(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     18ad <cvtv6+0x72d>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
lea    -0x30(%rbp),%rdi
lea    -0x38(%rbp),%rsi
mov    $0x4,%edx
call   1060 <memcmp@plt>
cmp    $0x0,%eax
jle    18db <cvtv6+0x75b>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
cmpl   $0x0,-0x8(%rbp)
jne    18fc <cvtv6+0x77c>
mov    -0x18(%rbp),%rdi
lea    -0x30(%rbp),%rsi
mov    $0x4,%edx
call   1070 <memcpy@plt>
jmp    1938 <cvtv6+0x7b8>
cmpl   $0xff,-0x8(%rbp)
jne    1920 <cvtv6+0x7a0>
mov    -0x18(%rbp),%rdi
lea    -0x38(%rbp),%rsi
mov    $0x4,%edx
call   1070 <memcpy@plt>
jmp    1933 <cvtv6+0x7b3>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
jmp    1938 <cvtv6+0x7b8>
movl   $0x0,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
jmp    1959 <cvtv6+0x7d9>
movl   $0xffffffff,-0x4(%rbp)
movl   $0x1,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rsp
mov    -0x4(%rbp),%eax
mov    %rbp,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cvtv6>:
push   %rbp
mov    %rsp,%rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    0x2e50(%rip),%rax
mov    (%rax),%r12d
mov    %rsp,%r13
lea    0xf(%r12),%rax
and    $0xfffffffffffffff0,%rax
sub    %rax,%r13
mov    %r13,%rsp
mov    $0xffffffff,%eax
test   %rsi,%rsi
je     1512 <cvtv6+0x392>
test   %rdx,%rdx
je     1512 <cvtv6+0x392>
mov    %rsi,%r15
mov    %edi,-0x44(%rbp)
mov    %rdx,-0x38(%rbp)
mov    (%rsi),%al
test   %al,%al
mov    %r12,-0x50(%rbp)
je     1200 <cvtv6+0x80>
xor    %ebx,%ebx
xor    %r14d,%r14d
nopl   (%rax)
movzbl %al,%edi
call   1050 <isspace@plt>
test   %rax,%rax
je     1207 <cvtv6+0x87>
movzbl 0x1(%r15,%r14,1),%eax
add    $0x1,%r14
test   %al,%al
jne    11e0 <cvtv6+0x60>
jmp    127d <cvtv6+0xfd>
xor    %r14d,%r14d
xor    %ebx,%ebx
jmp    127d <cvtv6+0xfd>
mov    (%r15,%r14,1),%al
test   %al,%al
je     1276 <cvtv6+0xf6>
cmp    $0x2,%r12
mov    %r12,%rcx
mov    $0x1,%r12d
cmovae %rcx,%r12
add    $0xffffffffffffffff,%r12
xor    %ebx,%ebx
jmp    124c <cvtv6+0xcc>
nopl   0x0(%rax,%rax,1)
movzbl (%r15,%r14,1),%eax
mov    %al,0x0(%r13,%rbx,1)
movzbl 0x1(%r15,%r14,1),%eax
add    $0x1,%r14
add    $0x1,%rbx
test   %al,%al
je     127d <cvtv6+0xfd>
cmp    %rbx,%r12
je     127a <cvtv6+0xfa>
movzbl %al,%edi
call   10a0 <isxdigit@plt>
test   %rax,%rax
jne    1230 <cvtv6+0xb0>
movsbl (%r15,%r14,1),%esi
lea    0xd96(%rip),%rdi
call   1030 <strchr@plt>
test   %rax,%rax
jne    1230 <cvtv6+0xb0>
jmp    127d <cvtv6+0xfd>
xor    %ebx,%ebx
jmp    127d <cvtv6+0xfd>
mov    %r12,%rbx
movb   $0x0,0x0(%r13,%rbx,1)
mov    0x2d56(%rip),%rax
mov    (%rax),%edi
lea    -0x30(%rbp),%rdx
mov    %r13,%rsi
call   1080 <inet_pton@plt>
cmp    $0x1,%eax
jne    150d <cvtv6+0x38d>
mov    (%r15,%r14,1),%al
test   %al,%al
je     12cb <cvtv6+0x14b>
nopl   0x0(%rax)
movzbl %al,%edi
call   1050 <isspace@plt>
test   %rax,%rax
je     12e4 <cvtv6+0x164>
movzbl 0x1(%r15,%r14,1),%eax
add    $0x1,%r14
test   %al,%al
jne    12b0 <cvtv6+0x130>
lea    -0x30(%rbp),%rsi
mov    -0x38(%rbp),%rdi
mov    $0x4,%edx
call   1070 <memcpy@plt>
xor    %eax,%eax
jmp    1512 <cvtv6+0x392>
movsbl (%r15,%r14,1),%eax
test   %eax,%eax
je     12cb <cvtv6+0x14b>
cmp    $0x2f,%eax
je     13c1 <cvtv6+0x241>
cmp    $0x2d,%eax
jne    150d <cvtv6+0x38d>
nop
mov    %r14,%r12
movzbl 0x1(%r15,%r14,1),%edi
test   %edi,%edi
je     144e <cvtv6+0x2ce>
call   1050 <isspace@plt>
lea    0x1(%r12),%r14
test   %rax,%rax
jne    1300 <cvtv6+0x180>
mov    0x1(%r15,%r12,1),%al
test   %al,%al
je     144e <cvtv6+0x2ce>
mov    -0x50(%rbp),%rcx
cmp    $0x2,%rcx
mov    $0x1,%edx
cmovae %rcx,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x60(%rbp)
lea    0x1(%r15),%rcx
mov    %rcx,-0x68(%rbp)
xor    %ebx,%ebx
mov    %r14,%r12
jmp    1379 <cvtv6+0x1f9>
mov    -0x50(%rbp),%rcx
movzbl -0x1(%rcx,%r14,1),%eax
mov    %al,0x0(%r13,%rbx,1)
add    $0x1,%r12
movzbl (%r14,%rcx,1),%eax
add    $0x1,%rbx
test   %al,%al
je     1454 <cvtv6+0x2d4>
cmp    %rbx,-0x60(%rbp)
je     153b <cvtv6+0x3bb>
mov    -0x68(%rbp),%rcx
add    %rbx,%rcx
mov    %rcx,-0x50(%rbp)
movzbl %al,%edi
call   10a0 <isxdigit@plt>
test   %rax,%rax
jne    1355 <cvtv6+0x1d5>
mov    -0x50(%rbp),%rax
movsbl -0x1(%rax,%r14,1),%esi
lea    0xc54(%rip),%rdi
call   1030 <strchr@plt>
test   %rax,%rax
jne    1355 <cvtv6+0x1d5>
add    %rbx,%r14
mov    %r14,%r12
jmp    1454 <cvtv6+0x2d4>
lea    (%r15,%r14,1),%rbx
add    $0x1,%rbx
lea    -0x30(%rbp),%rsi
mov    -0x38(%rbp),%rdi
mov    $0x4,%edx
call   1070 <memcpy@plt>
nopl   0x0(%rax,%rax,1)
mov    %rbx,%r15
movzbl (%rbx),%edi
test   %edi,%edi
je     13f8 <cvtv6+0x278>
call   1050 <isspace@plt>
lea    0x1(%r15),%rbx
test   %rax,%rax
jne    13e0 <cvtv6+0x260>
lea    0xc04(%rip),%rsi
lea    -0x40(%rbp),%rdx
lea    -0x54(%rbp),%rcx
mov    %r15,%rdi
call   1090 <sscanf@plt>
test   %eax,%eax
jle    150d <cvtv6+0x38d>
cmpq   $0x20,-0x40(%rbp)
ja     150d <cvtv6+0x38d>
movslq -0x54(%rbp),%r14
mov    (%r15,%r14,1),%al
test   %al,%al
je     14aa <cvtv6+0x32a>
add    $0x1,%r15
movzbl %al,%edi
call   1050 <isspace@plt>
test   %rax,%rax
je     14a2 <cvtv6+0x322>
movzbl (%r15,%r14,1),%eax
add    $0x1,%r15
test   %al,%al
jne    1432 <cvtv6+0x2b2>
jmp    14aa <cvtv6+0x32a>
add    $0x1,%r12
xor    %ebx,%ebx
movb   $0x0,0x0(%r13,%rbx,1)
mov    0x2b7f(%rip),%rax
mov    (%rax),%edi
lea    -0x40(%rbp),%rdx
mov    %r13,%rsi
call   1080 <inet_pton@plt>
cmp    $0x1,%eax
jne    150d <cvtv6+0x38d>
mov    (%r15,%r12,1),%al
test   %al,%al
je     14f7 <cvtv6+0x377>
lea    (%r12,%r15,1),%rbx
add    $0x1,%rbx
movzbl %al,%edi
call   1050 <isspace@plt>
test   %rax,%rax
je     14f1 <cvtv6+0x371>
movzbl (%rbx),%eax
add    $0x1,%rbx
test   %al,%al
jne    1488 <cvtv6+0x308>
jmp    14f7 <cvtv6+0x377>
cmpb   $0x0,-0x1(%r15,%r14,1)
jne    150d <cvtv6+0x38d>
mov    -0x44(%rbp),%eax
cmp    $0xff,%eax
je     1544 <cvtv6+0x3c4>
test   %eax,%eax
mov    $0xffffffff,%eax
jne    1512 <cvtv6+0x392>
mov    -0x40(%rbp),%rax
mov    %rax,%rdx
and    $0x7,%rdx
je     1572 <cvtv6+0x3f2>
mov    $0x8,%cl
sub    %dl,%cl
mov    $0xff,%edx
shl    %cl,%edx
shr    $0x3,%rax
mov    -0x38(%rbp),%rcx
and    %edx,(%rcx,%rax,4)
add    $0x1,%rax
jmp    157a <cvtv6+0x3fa>
cmpb   $0x0,-0x1(%rbx)
jne    150d <cvtv6+0x38d>
lea    -0x30(%rbp),%rdi
lea    -0x40(%rbp),%rsi
mov    $0x4,%edx
call   1060 <memcmp@plt>
test   %eax,%eax
jle    1521 <cvtv6+0x3a1>
mov    $0xffffffff,%eax
lea    -0x28(%rbp),%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    -0x44(%rbp),%ecx
cmp    $0xff,%ecx
mov    $0xffffffff,%eax
je     1569 <cvtv6+0x3e9>
test   %ecx,%ecx
je     12cb <cvtv6+0x14b>
jmp    1512 <cvtv6+0x392>
mov    -0x60(%rbp),%rbx
jmp    1454 <cvtv6+0x2d4>
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
and    $0x7,%rcx
je     1591 <cvtv6+0x411>
mov    $0xff,%edx
shr    %cl,%edx
shr    $0x3,%rax
mov    -0x38(%rbp),%rcx
or     %edx,(%rcx,%rax,4)
add    $0x1,%rax
jmp    1599 <cvtv6+0x419>
lea    -0x40(%rbp),%rsi
jmp    12cf <cvtv6+0x14f>
shr    $0x3,%rax
mov    -0x38(%rbp),%rcx
lea    (%rcx,%rax,4),%rdi
mov    $0x4,%edx
sub    %eax,%edx
xor    %esi,%esi
call   1040 <memset@plt>
jmp    12dd <cvtv6+0x15d>
shr    $0x3,%rax
mov    -0x38(%rbp),%rcx
lea    (%rcx,%rax,4),%rdi
mov    $0x4,%edx
sub    %eax,%edx
mov    $0xff,%esi
call   1040 <memset@plt>
jmp    12dd <cvtv6+0x15d>

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

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