#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 */
struct sockaddr_in6 {
  int sin6_family;
  int /*<<< orphan*/ sin6_addr;
};
struct sockaddr_in {
  int sin_family;
  int /*<<< orphan*/ sin_addr;
};

/* Variables and functions */
int AF_INET;
int AF_INET6;
scalar_t__ inet_pton(int, char const *, void *);
int /*<<< orphan*/ isdigit(char const);
unsigned long strtoul(char const *, char **, int /*<<< orphan*/);
int __ipparse(void *dest, int family, const char *s0) {
  const char *s = s0;
  unsigned char *d = dest;
  unsigned long a[16] = {0};
  char *z;
  int i;
  if (family == AF_INET6)
    goto not_v4;
  for (i = 0; i < 4; i++) {
    a[i] = strtoul(s, &z, 0);
    if (z == s || (*z && *z != '.') || !isdigit(*s)) {
      if (family == AF_INET)
        return -1;
      goto not_v4;
    }
    if (!*z)
      break;
    s = z + 1;
  }
  if (i == 4)
    return -1;
  switch (i) {
  case 0:
    a[1] = a[0] & 0xffffff;
    a[0] >>= 24;
  case 1:
    a[2] = a[1] & 0xffff;
    a[1] >>= 16;
  case 2:
    a[3] = a[2] & 0xff;
    a[2] >>= 8;
  }
  ((struct sockaddr_in *)d)->sin_family = AF_INET;
  d = (void *)&((struct sockaddr_in *)d)->sin_addr;
  for (i = 0; i < 4; i++) {
    if (a[i] > 255)
      return -1;
    d[i] = a[i];
  }
  return 0;
not_v4:
  s = s0;
  ((struct sockaddr_in6 *)d)->sin6_family = AF_INET6;
  return inet_pton(AF_INET6, s,
                   (void *)&((struct sockaddr_in6 *)d)->sin6_addr) <= 0
             ? -1
             : 0;
}


x86 assembly (clang, -O0):
<__ipparse>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
lea    -0xb0(%rbp),%rdi
xor    %esi,%esi
mov    $0x80,%edx
call   1040 <memset@plt>
mov    -0x14(%rbp),%eax
mov    0x2e5d(%rip),%rcx
cmp    (%rcx),%eax
jne    1190 <__ipparse+0x50>
jmp    13d4 <__ipparse+0x294>
movl   $0x0,-0xbc(%rbp)
cmpl   $0x4,-0xbc(%rbp)
jge    1272 <__ipparse+0x132>
mov    -0x28(%rbp),%rdi
lea    -0xb8(%rbp),%rsi
xor    %edx,%edx
call   1060 <strtoul@plt>
mov    %rax,%rcx
movslq -0xbc(%rbp),%rax
mov    %rcx,-0xb0(%rbp,%rax,8)
ff
mov    -0xb8(%rbp),%rax
cmp    -0x28(%rbp),%rax
je     1217 <__ipparse+0xd7>
mov    -0xb8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1202 <__ipparse+0xc2>
mov    -0xb8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1217 <__ipparse+0xd7>
mov    -0x28(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
jne    123a <__ipparse+0xfa>
mov    -0x14(%rbp),%eax
mov    0x2dc7(%rip),%rcx
cmp    (%rcx),%eax
jne    1235 <__ipparse+0xf5>
movl   $0xffffffff,-0x4(%rbp)
jmp    1419 <__ipparse+0x2d9>
jmp    13d4 <__ipparse+0x294>
mov    -0xb8(%rbp),%rax
cmpb   $0x0,(%rax)
jne    124f <__ipparse+0x10f>
jmp    1272 <__ipparse+0x132>
mov    -0xb8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0xbc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xbc(%rbp)
jmp    119a <__ipparse+0x5a>
cmpl   $0x4,-0xbc(%rbp)
jne    128b <__ipparse+0x14b>
movl   $0xffffffff,-0x4(%rbp)
jmp    1419 <__ipparse+0x2d9>
mov    -0xbc(%rbp),%eax
mov    %eax,-0xc0(%rbp)
test   %eax,%eax
je     12cc <__ipparse+0x18c>
jmp    12a4 <__ipparse+0x164>
mov    -0xc0(%rbp),%eax
sub    $0x1,%eax
je     12f2 <__ipparse+0x1b2>
jmp    12b8 <__ipparse+0x178>
mov    -0xc0(%rbp),%eax
sub    $0x2,%eax
je     1318 <__ipparse+0x1d8>
jmp    133e <__ipparse+0x1fe>
mov    -0xb0(%rbp),%rax
and    $0xffffff,%rax
mov    %rax,-0xa8(%rbp)
mov    -0xb0(%rbp),%rax
shr    $0x18,%rax
mov    %rax,-0xb0(%rbp)
mov    -0xa8(%rbp),%rax
and    $0xffff,%rax
mov    %rax,-0xa0(%rbp)
mov    -0xa8(%rbp),%rax
shr    $0x10,%rax
mov    %rax,-0xa8(%rbp)
mov    -0xa0(%rbp),%rax
and    $0xff,%rax
mov    %rax,-0x98(%rbp)
mov    -0xa0(%rbp),%rax
shr    $0x8,%rax
mov    %rax,-0xa0(%rbp)
mov    0x2ca3(%rip),%rax
mov    (%rax),%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x30(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x30(%rbp)
movl   $0x0,-0xbc(%rbp)
cmpl   $0x4,-0xbc(%rbp)
jge    13c8 <__ipparse+0x288>
movslq -0xbc(%rbp),%rax
cmpq   $0xff,-0xb0(%rbp,%rax,8)
jbe    1395 <__ipparse+0x255>
movl   $0xffffffff,-0x4(%rbp)
jmp    1419 <__ipparse+0x2d9>
movslq -0xbc(%rbp),%rax
mov    -0xb0(%rbp,%rax,8),%rax
ff
mov    %al,%dl
mov    -0x30(%rbp),%rax
movslq -0xbc(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0xbc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xbc(%rbp)
jmp    1363 <__ipparse+0x223>
movl   $0x0,-0x4(%rbp)
jmp    1419 <__ipparse+0x2d9>
mov    -0x20(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    0x2bfd(%rip),%rax
mov    (%rax),%ecx
mov    -0x30(%rbp),%rax
mov    %ecx,(%rax)
mov    0x2bee(%rip),%rax
mov    (%rax),%edi
mov    -0x28(%rbp),%rsi
mov    -0x30(%rbp),%rdx
add    $0x4,%rdx
call   1050 <inet_pton@plt>
mov    %rax,%rdx
xor    %eax,%eax
mov    $0xffffffff,%ecx
cmp    $0x0,%rdx
cmovle %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xc0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<__ipparse>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rdx,%r13
mov    %esi,%ebp
mov    %rdi,%r15
mov    0x2e93(%rip),%r14
cmp    %esi,(%r14)
je     12b1 <__ipparse+0x181>
lea    0x8(%rsp),%rsi
mov    %r13,%rdi
xor    %edx,%edx
call   1050 <strtoul@plt>
mov    %rax,0x10(%rsp)
mov    0x8(%rsp),%rbx
cmp    %r13,%rbx
je     129e <__ipparse+0x16e>
mov    (%rbx),%al
cmp    $0x2e,%al
je     1186 <__ipparse+0x56>
test   %al,%al
jne    129e <__ipparse+0x16e>
movsbl 0x0(%r13),%edi
call   1030 <isdigit@plt>
test   %eax,%eax
je     129e <__ipparse+0x16e>
cmpb   $0x0,(%rbx)
je     12e2 <__ipparse+0x1b2>
add    $0x1,%rbx
lea    0x8(%rsp),%rsi
mov    %rbx,%rdi
xor    %edx,%edx
call   1050 <strtoul@plt>
mov    %rax,0x20(%rsp)
mov    0x8(%rsp),%r12
cmp    %rbx,%r12
je     129e <__ipparse+0x16e>
mov    (%r12),%al
cmp    $0x2e,%al
je     11d7 <__ipparse+0xa7>
test   %al,%al
jne    129e <__ipparse+0x16e>
movsbl (%rbx),%edi
call   1030 <isdigit@plt>
test   %eax,%eax
je     129e <__ipparse+0x16e>
cmpb   $0x0,(%r12)
je     134a <__ipparse+0x21a>
add    $0x1,%r12
lea    0x8(%rsp),%rsi
mov    %r12,%rdi
xor    %edx,%edx
call   1050 <strtoul@plt>
mov    0x8(%rsp),%rcx
cmp    %r12,%rcx
je     129e <__ipparse+0x16e>
mov    %rax,%rbx
mov    (%rcx),%al
cmp    $0x2e,%al
je     1220 <__ipparse+0xf0>
test   %al,%al
jne    129e <__ipparse+0x16e>
mov    %rcx,0x18(%rsp)
movsbl (%r12),%edi
call   1030 <isdigit@plt>
mov    0x18(%rsp),%r12
test   %eax,%eax
je     129e <__ipparse+0x16e>
cmpb   $0x0,(%r12)
je     1356 <__ipparse+0x226>
add    $0x1,%r12
lea    0x8(%rsp),%rsi
mov    %r12,%rdi
xor    %edx,%edx
call   1050 <strtoul@plt>
mov    %r12,%rdx
mov    0x8(%rsp),%r12
cmp    %rdx,%r12
je     129e <__ipparse+0x16e>
mov    (%r12),%cl
cmp    $0x2e,%cl
je     1270 <__ipparse+0x140>
test   %cl,%cl
jne    129e <__ipparse+0x16e>
movsbl (%rdx),%edi
mov    %rax,0x18(%rsp)
call   1030 <isdigit@plt>
mov    0x18(%rsp),%rsi
test   %eax,%eax
je     129e <__ipparse+0x16e>
mov    $0xffffffff,%eax
cmpb   $0x0,(%r12)
jne    12d3 <__ipparse+0x1a3>
mov    0x10(%rsp),%rcx
mov    0x20(%rsp),%rdx
jmp    1301 <__ipparse+0x1d1>
mov    0x2d43(%rip),%rcx
mov    $0xffffffff,%eax
cmp    %ebp,(%rcx)
je     12d3 <__ipparse+0x1a3>
mov    (%r14),%ebp
mov    %ebp,(%r15)
mov    (%r14),%edi
add    $0x4,%r15
mov    %r13,%rsi
mov    %r15,%rdx
call   1040 <inet_pton@plt>
mov    %rax,%rcx
xor    %eax,%eax
test   %rcx,%rcx
setle  %al
neg    %eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    0x10(%rsp),%rcx
mov    %ecx,%edx
and    $0xffffff,%edx
shr    $0x18,%rcx
movzwl %dx,%ebx
shr    $0x10,%rdx
movzbl %bl,%esi
shr    $0x8,%rbx
mov    0x2ce0(%rip),%rax
mov    (%rax),%eax
mov    %eax,(%r15)
mov    $0xffffffff,%eax
cmp    $0xff,%rcx
ja     12d3 <__ipparse+0x1a3>
mov    %cl,0x4(%r15)
cmp    $0xff,%rdx
ja     12d3 <__ipparse+0x1a3>
mov    %dl,0x5(%r15)
cmp    $0xff,%rbx
ja     12d3 <__ipparse+0x1a3>
mov    %bl,0x6(%r15)
cmp    $0xff,%rsi
ja     12d3 <__ipparse+0x1a3>
mov    %sil,0x7(%r15)
xor    %eax,%eax
jmp    12d3 <__ipparse+0x1a3>
mov    0x10(%rsp),%rcx
mov    0x20(%rsp),%rdx
jmp    12f3 <__ipparse+0x1c3>
mov    0x10(%rsp),%rcx
mov    0x20(%rsp),%rdx
jmp    12fa <__ipparse+0x1ca>

LLVM IR (-O0):
%struct.sockaddr_in = type { i32, i32 }
%struct.sockaddr_in6 = type { i32, i32 }
@AF_INET6 = global i32 0
@AF_INET = global i32 0
define i32 @__ipparse(i8* %0, i32 %1, i8* %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca [16 x i64]
%11 = alloca i8*
%12 = alloca i32
store i8* %0, i8** %5
store i32 %1, i32* %6
store i8* %2, i8** %7
%13 = load i8*, i8** %7
store i8* %13, i8** %8
%14 = load i8*, i8** %5
store i8* %14, i8** %9
%15 = bitcast [16 x i64]* %10 to i8*
%16 = load i32, i32* %6
%17 = load i32, i32* @AF_INET6
%18 = icmp eq i32 %16, %17
br i1 %18, label %19, label %20
19: ; preds = %3
br label %128
20: ; preds = %3
store i32 0, i32* %12
br label %21
21: ; preds = %62, %20
%22 = load i32, i32* %12
%23 = icmp slt i32 %22, 4
br i1 %23, label %24, label %65
24: ; preds = %21
%25 = load i8*, i8** %8
%26 = call i64 @strtoul(i8* %25, i8** %11, i32 0)
%27 = load i32, i32* %12
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 %28
store i64 %26, i64* %29
%30 = load i8*, i8** %11
%31 = load i8*, i8** %8
%32 = icmp eq i8* %30, %31
br i1 %32, label %48, label %33
33: ; preds = %24
%34 = load i8*, i8** %11
%35 = load i8, i8* %34
%36 = sext i8 %35 to i32
%37 = icmp ne i32 %36, 0
br i1 %37, label %38, label %43
38: ; preds = %33
%39 = load i8*, i8** %11
%40 = load i8, i8* %39
%41 = sext i8 %40 to i32
%42 = icmp ne i32 %41, 46
br i1 %42, label %48, label %43
43: ; preds = %38, %33
%44 = load i8*, i8** %8
%45 = load i8, i8* %44
%46 = call i32 @isdigit(i8 signext %45)
%47 = icmp ne i32 %46, 0
br i1 %47, label %54, label %48
48: ; preds = %43, %38, %24
%49 = load i32, i32* %6
%50 = load i32, i32* @AF_INET
%51 = icmp eq i32 %49, %50
br i1 %51, label %52, label %53
52: ; preds = %48
store i32 -1, i32* %4
br label %144
53: ; preds = %48
br label %128
54: ; preds = %43
%55 = load i8*, i8** %11
%56 = load i8, i8* %55
%57 = icmp ne i8 %56, 0
br i1 %57, label %59, label %58
58: ; preds = %54
br label %65
59: ; preds = %54
%60 = load i8*, i8** %11
%61 = getelementptr inbounds i8, i8* %60, i64 1
store i8* %61, i8** %8
br label %62
62: ; preds = %59
%63 = load i32, i32* %12
%64 = add nsw i32 %63, 1
store i32 %64, i32* %12
br label %21
65: ; preds = %58, %21
%66 = load i32, i32* %12
%67 = icmp eq i32 %66, 4
br i1 %67, label %68, label %69
68: ; preds = %65
store i32 -1, i32* %4
br label %144
69: ; preds = %65
%70 = load i32, i32* %12
switch i32 %70, label %95 [
i32 0, label %71
i32 1, label %79
i32 2, label %87
]
71: ; preds = %69
%72 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 0
%73 = load i64, i64* %72
%74 = and i64 %73, 16777215
%75 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 1
store i64 %74, i64* %75
%76 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 0
%77 = load i64, i64* %76
%78 = lshr i64 %77, 24
store i64 %78, i64* %76
br label %79
79: ; preds = %69, %71
%80 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 1
%81 = load i64, i64* %80
%82 = and i64 %81, 65535
%83 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 2
store i64 %82, i64* %83
%84 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 1
%85 = load i64, i64* %84
%86 = lshr i64 %85, 16
store i64 %86, i64* %84
br label %87
87: ; preds = %69, %79
%88 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 2
%89 = load i64, i64* %88
%90 = and i64 %89, 255
%91 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 3
store i64 %90, i64* %91
%92 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 2
%93 = load i64, i64* %92
%94 = lshr i64 %93, 8
store i64 %94, i64* %92
br label %95
95: ; preds = %87, %69
%96 = load i32, i32* @AF_INET
%97 = load i8*, i8** %9
%98 = bitcast i8* %97 to %struct.sockaddr_in*
%99 = getelementptr inbounds %struct.sockaddr_in, %struct.sockaddr_in* %98, i32 0, i32 0
store i32 %96, i32* %99
%100 = load i8*, i8** %9
%101 = bitcast i8* %100 to %struct.sockaddr_in*
%102 = getelementptr inbounds %struct.sockaddr_in, %struct.sockaddr_in* %101, i32 0, i32 1
%103 = bitcast i32* %102 to i8*
store i8* %103, i8** %9
store i32 0, i32* %12
br label %104
104: ; preds = %124, %95
%105 = load i32, i32* %12
%106 = icmp slt i32 %105, 4
br i1 %106, label %107, label %127
107: ; preds = %104
%108 = load i32, i32* %12
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 %109
%111 = load i64, i64* %110
%112 = icmp ugt i64 %111, 255
br i1 %112, label %113, label %114
113: ; preds = %107
store i32 -1, i32* %4
br label %144
114: ; preds = %107
%115 = load i32, i32* %12
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds [16 x i64], [16 x i64]* %10, i64 0, i64 %116
%118 = load i64, i64* %117
%119 = trunc i64 %118 to i8
%120 = load i8*, i8** %9
%121 = load i32, i32* %12
%122 = sext i32 %121 to i64
%123 = getelementptr inbounds i8, i8* %120, i64 %122
store i8 %119, i8* %123
br label %124
124: ; preds = %114
%125 = load i32, i32* %12
%126 = add nsw i32 %125, 1
store i32 %126, i32* %12
br label %104
127: ; preds = %104
store i32 0, i32* %4
br label %144
128: ; preds = %53, %19
%129 = load i8*, i8** %7
store i8* %129, i8** %8
%130 = load i32, i32* @AF_INET6
%131 = load i8*, i8** %9
%132 = bitcast i8* %131 to %struct.sockaddr_in6*
%133 = getelementptr inbounds %struct.sockaddr_in6, %struct.sockaddr_in6* %132, i32 0, i32 0
store i32 %130, i32* %133
%134 = load i32, i32* @AF_INET6
%135 = load i8*, i8** %8
%136 = load i8*, i8** %9
%137 = bitcast i8* %136 to %struct.sockaddr_in6*
%138 = getelementptr inbounds %struct.sockaddr_in6, %struct.sockaddr_in6* %137, i32 0, i32 1
%139 = bitcast i32* %138 to i8*
%140 = call i64 @inet_pton(i32 %134, i8* %135, i8* %139)
%141 = icmp sle i64 %140, 0
%142 = zext i1 %141 to i64
%143 = select i1 %141, i32 -1, i32 0
store i32 %143, i32* %4
br label %144
144: ; preds = %128, %127, %113, %68, %52
%145 = load i32, i32* %4
ret i32 %145
}

LLVM IR (-O2):
@AF_INET6 = global i32 0
@AF_INET = global i32 0
define i32 @__ipparse(i8* %0, i32 %1, i8* %2) {
%4 = alloca i8*
%5 = bitcast i8** %4 to i8*
%6 = load i32, i32* @AF_INET6
%7 = icmp eq i32 %6, %1
br i1 %7, label %105, label %8
8: ; preds = %3
%9 = call i64 @strtoul(i8* %2, i8** %4, i32 0)
%10 = load i8*, i8** %4
%11 = icmp eq i8* %10, %2
br i1 %11, label %18, label %12
12: ; preds = %8
%13 = load i8, i8* %10
switch i8 %13, label %18 [
i8 0, label %14
i8 46, label %14
]
14: ; preds = %12, %12
%15 = load i8, i8* %2
%16 = tail call i32 @isdigit(i8 signext %15)
%17 = icmp eq i32 %16, 0
br i1 %17, label %18, label %23
18: ; preds = %61, %59, %54, %47, %45, %40, %33, %31, %26, %12, %14, %8
%19 = load i32, i32* @AF_INET
%20 = icmp eq i32 %19, %1
br i1 %20, label %113, label %21
21: ; preds = %18
%22 = load i32, i32* @AF_INET6
br label %105
23: ; preds = %14
%24 = load i8, i8* %10
%25 = icmp eq i8 %24, 0
br i1 %25, label %68, label %26
26: ; preds = %23
%27 = getelementptr inbounds i8, i8* %10, i64 1
%28 = call i64 @strtoul(i8* %27, i8** %4, i32 0)
%29 = load i8*, i8** %4
%30 = icmp eq i8* %29, %27
br i1 %30, label %18, label %31
31: ; preds = %26
%32 = load i8, i8* %29
switch i8 %32, label %18 [
i8 0, label %33
i8 46, label %33
]
33: ; preds = %31, %31
%34 = load i8, i8* %27
%35 = tail call i32 @isdigit(i8 signext %34)
%36 = icmp eq i32 %35, 0
br i1 %36, label %18, label %37
37: ; preds = %33
%38 = load i8, i8* %29
%39 = icmp eq i8 %38, 0
br i1 %39, label %71, label %40
40: ; preds = %37
%41 = getelementptr inbounds i8, i8* %29, i64 1
%42 = call i64 @strtoul(i8* %41, i8** %4, i32 0)
%43 = load i8*, i8** %4
%44 = icmp eq i8* %43, %41
br i1 %44, label %18, label %45
45: ; preds = %40
%46 = load i8, i8* %43
switch i8 %46, label %18 [
i8 0, label %47
i8 46, label %47
]
47: ; preds = %45, %45
%48 = load i8, i8* %41
%49 = tail call i32 @isdigit(i8 signext %48)
%50 = icmp eq i32 %49, 0
br i1 %50, label %18, label %51
51: ; preds = %47
%52 = load i8, i8* %43
%53 = icmp eq i8 %52, 0
br i1 %53, label %76, label %54
54: ; preds = %51
%55 = getelementptr inbounds i8, i8* %43, i64 1
%56 = call i64 @strtoul(i8* %55, i8** %4, i32 0)
%57 = load i8*, i8** %4
%58 = icmp eq i8* %57, %55
br i1 %58, label %18, label %59
59: ; preds = %54
%60 = load i8, i8* %57
switch i8 %60, label %18 [
i8 0, label %61
i8 46, label %61
]
61: ; preds = %59, %59
%62 = load i8, i8* %55
%63 = tail call i32 @isdigit(i8 signext %62)
%64 = icmp eq i32 %63, 0
br i1 %64, label %18, label %65
65: ; preds = %61
%66 = load i8, i8* %57
%67 = icmp eq i8 %66, 0
br i1 %67, label %82, label %113
68: ; preds = %23
%69 = and i64 %9, 16777215
%70 = lshr i64 %9, 24
br label %71
71: ; preds = %37, %68
%72 = phi i64 [ %70, %68 ], [ %9, %37 ]
%73 = phi i64 [ %69, %68 ], [ %28, %37 ]
%74 = and i64 %73, 65535
%75 = lshr i64 %73, 16
br label %76
76: ; preds = %51, %71
%77 = phi i64 [ %72, %71 ], [ %9, %51 ]
%78 = phi i64 [ %75, %71 ], [ %28, %51 ]
%79 = phi i64 [ %74, %71 ], [ %42, %51 ]
%80 = and i64 %79, 255
%81 = lshr i64 %79, 8
br label %82
82: ; preds = %65, %76
%83 = phi i64 [ %77, %76 ], [ %9, %65 ]
%84 = phi i64 [ %78, %76 ], [ %28, %65 ]
%85 = phi i64 [ %81, %76 ], [ %42, %65 ]
%86 = phi i64 [ %80, %76 ], [ %56, %65 ]
%87 = load i32, i32* @AF_INET
%88 = bitcast i8* %0 to i32*
store i32 %87, i32* %88
%89 = icmp ugt i64 %83, 255
br i1 %89, label %113, label %90
90: ; preds = %82
%91 = getelementptr inbounds i8, i8* %0, i64 4
%92 = trunc i64 %83 to i8
store i8 %92, i8* %91
%93 = icmp ugt i64 %84, 255
br i1 %93, label %113, label %94
94: ; preds = %90
%95 = trunc i64 %84 to i8
%96 = getelementptr inbounds i8, i8* %0, i64 5
store i8 %95, i8* %96
%97 = icmp ugt i64 %85, 255
br i1 %97, label %113, label %98
98: ; preds = %94
%99 = trunc i64 %85 to i8
%100 = getelementptr inbounds i8, i8* %0, i64 6
store i8 %99, i8* %100
%101 = icmp ugt i64 %86, 255
br i1 %101, label %113, label %102
102: ; preds = %98
%103 = trunc i64 %86 to i8
%104 = getelementptr inbounds i8, i8* %0, i64 7
store i8 %103, i8* %104
br label %113
105: ; preds = %21, %3
%106 = phi i32 [ %22, %21 ], [ %1, %3 ]
%107 = bitcast i8* %0 to i32*
store i32 %106, i32* %107
%108 = load i32, i32* @AF_INET6
%109 = getelementptr inbounds i8, i8* %0, i64 4
%110 = tail call i64 @inet_pton(i32 %108, i8* %2, i8* %109)
%111 = icmp slt i64 %110, 1
%112 = sext i1 %111 to i32
br label %113
113: ; preds = %65, %82, %90, %94, %98, %102, %18, %105
%114 = phi i32 [ %112, %105 ], [ -1, %18 ], [ -1, %82 ], [ -1, %90 ], [ -1, %94 ], [ -1, %98 ], [ 0, %102 ], [ -1, %65 ]
ret i32 %114
}