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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int atoi(char *);
scalar_t__ strlen(char *);
int prase_ip_mask(char *a, int *ip) {
  char *s = a, *e = a;
  int index = 0;
  while (*e != '\0') {
    if (*e == '.' || *e == '~') {
      *e = '\0';
      if (strlen(s) == 0)
        return 0;
      ip[index] = atoi(s);
      if (ip[index] < 0 || ip[index] > 255)
        return 0;
      s = e + 1;
      index++;
    }
    e++;
    a++;
  }
  if (strlen(s) == 0)
    return 0;
  ip[index] = atoi(s);
  if (ip[index] < 0 || ip[index] > 255 || index != 7)
    return 0;
  int tmp = (ip[4] << 24) | (ip[5] << 16) | (ip[6] << 8) | ip[7];
  if (tmp == 0 || tmp == 0xffffffff)
    return 0;
  if (((~tmp + 1) & ~tmp & 0xffffffff) != 0)
    return 0;
  return 1;
}


x86 assembly (clang, -O0):
<prase_ip_mask>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1218 <prase_ip_mask+0xf8>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
je     1177 <prase_ip_mask+0x57>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7e,%eax
jne    11fb <prase_ip_mask+0xdb>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x20(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x0,%rax
jne    119d <prase_ip_mask+0x7d>
movl   $0x0,-0x4(%rbp)
jmp    1306 <prase_ip_mask+0x1e6>
mov    -0x20(%rbp),%rdi
call   1040 <atoi@plt>
mov    %eax,%edx
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jl     11da <prase_ip_mask+0xba>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
cmpl   $0xff,(%rax,%rcx,4)
jle    11e6 <prase_ip_mask+0xc6>
movl   $0x0,-0x4(%rbp)
jmp    1306 <prase_ip_mask+0x1e6>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1147 <prase_ip_mask+0x27>
mov    -0x20(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x0,%rax
jne    1237 <prase_ip_mask+0x117>
movl   $0x0,-0x4(%rbp)
jmp    1306 <prase_ip_mask+0x1e6>
mov    -0x20(%rbp),%rdi
call   1040 <atoi@plt>
mov    %eax,%edx
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jl     127e <prase_ip_mask+0x15e>
mov    -0x18(%rbp),%rax
movslq -0x2c(%rbp),%rcx
cmpl   $0xff,(%rax,%rcx,4)
jg     127e <prase_ip_mask+0x15e>
cmpl   $0x7,-0x2c(%rbp)
je     128a <prase_ip_mask+0x16a>
movl   $0x0,-0x4(%rbp)
jmp    1306 <prase_ip_mask+0x1e6>
mov    -0x18(%rbp),%rax
mov    0x10(%rax),%eax
shl    $0x18,%eax
mov    -0x18(%rbp),%rcx
mov    0x14(%rcx),%ecx
shl    $0x10,%ecx
or     %ecx,%eax
mov    -0x18(%rbp),%rcx
mov    0x18(%rcx),%ecx
shl    $0x8,%ecx
or     %ecx,%eax
mov    -0x18(%rbp),%rcx
or     0x1c(%rcx),%eax
mov    %eax,-0x30(%rbp)
cmpl   $0x0,-0x30(%rbp)
je     12ca <prase_ip_mask+0x1aa>
cmpl   $0xffffffff,-0x30(%rbp)
jne    12d6 <prase_ip_mask+0x1b6>
movl   $0x0,-0x4(%rbp)
jmp    1306 <prase_ip_mask+0x1e6>
mov    -0x30(%rbp),%eax
xor    $0xffffffff,%eax
add    $0x1,%eax
mov    -0x30(%rbp),%ecx
xor    $0xffffffff,%ecx
and    %ecx,%eax
and    $0xffffffff,%eax
cmp    $0x0,%eax
je     12ff <prase_ip_mask+0x1df>
movl   $0x0,-0x4(%rbp)
jmp    1306 <prase_ip_mask+0x1e6>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<prase_ip_mask>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
lea    0x1(%rdi),%rbp
xor    %ebx,%ebx
xor    %r15d,%r15d
jmp    1138 <prase_ip_mask+0x28>
cs nopw 0x0(%rax,%rax,1)
nop
test   %al,%al
je     1168 <prase_ip_mask+0x58>
add    $0x1,%rbp
movzbl -0x1(%rbp),%eax
cmp    $0x2e,%al
je     1144 <prase_ip_mask+0x34>
cmp    $0x7e,%al
jne    1130 <prase_ip_mask+0x20>
movb   $0x0,-0x1(%rbp)
cmpb   $0x0,(%rdi)
je     11c0 <prase_ip_mask+0xb0>
call   1030 <atoi@plt>
movslq %ebx,%rcx
mov    %eax,(%r14,%rcx,4)
cmp    $0xff,%eax
ja     11c0 <prase_ip_mask+0xb0>
add    $0x1,%ebx
mov    %rbp,%rdi
jmp    1134 <prase_ip_mask+0x24>
xor    %r15d,%r15d
cmpb   $0x0,(%rdi)
je     11c0 <prase_ip_mask+0xb0>
call   1030 <atoi@plt>
movslq %ebx,%rcx
mov    %eax,(%r14,%rcx,4)
test   %eax,%eax
js     11c0 <prase_ip_mask+0xb0>
cmp    $0xff,%eax
ja     11c0 <prase_ip_mask+0xb0>
cmp    $0x7,%ebx
jne    11c0 <prase_ip_mask+0xb0>
mov    0x10(%r14),%eax
mov    0x14(%r14),%ecx
shl    $0x18,%eax
shl    $0x10,%ecx
or     %eax,%ecx
mov    0x18(%r14),%eax
shl    $0x8,%eax
or     %ecx,%eax
or     0x1c(%r14),%eax
lea    0x1(%rax),%ecx
cmp    $0x2,%ecx
jb     11c0 <prase_ip_mask+0xb0>
mov    %eax,%ecx
not    %ecx
neg    %eax
xor    %r15d,%r15d
test   %ecx,%eax
sete   %r15b
mov    %r15d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @prase_ip_mask(i8* %0, i32* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32*
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %4
store i32* %1, i32** %5
%10 = load i8*, i8** %4
store i8* %10, i8** %6
%11 = load i8*, i8** %4
store i8* %11, i8** %7
store i32 0, i32* %8
br label %12
12: ; preds = %59, %2
%13 = load i8*, i8** %7
%14 = load i8, i8* %13
%15 = sext i8 %14 to i32
%16 = icmp ne i32 %15, 0
br i1 %16, label %17, label %64
17: ; preds = %12
%18 = load i8*, i8** %7
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = icmp eq i32 %20, 46
br i1 %21, label %27, label %22
22: ; preds = %17
%23 = load i8*, i8** %7
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp eq i32 %25, 126
br i1 %26, label %27, label %59
27: ; preds = %22, %17
%28 = load i8*, i8** %7
store i8 0, i8* %28
%29 = load i8*, i8** %6
%30 = call i64 @strlen(i8* %29)
%31 = icmp eq i64 %30, 0
br i1 %31, label %32, label %33
32: ; preds = %27
store i32 0, i32* %3
br label %129
33: ; preds = %27
%34 = load i8*, i8** %6
%35 = call i32 @atoi(i8* %34)
%36 = load i32*, i32** %5
%37 = load i32, i32* %8
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i32, i32* %36, i64 %38
store i32 %35, i32* %39
%40 = load i32*, i32** %5
%41 = load i32, i32* %8
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i32, i32* %40, i64 %42
%44 = load i32, i32* %43
%45 = icmp slt i32 %44, 0
br i1 %45, label %53, label %46
46: ; preds = %33
%47 = load i32*, i32** %5
%48 = load i32, i32* %8
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i32, i32* %47, i64 %49
%51 = load i32, i32* %50
%52 = icmp sgt i32 %51, 255
br i1 %52, label %53, label %54
53: ; preds = %46, %33
store i32 0, i32* %3
br label %129
54: ; preds = %46
%55 = load i8*, i8** %7
%56 = getelementptr inbounds i8, i8* %55, i64 1
store i8* %56, i8** %6
%57 = load i32, i32* %8
%58 = add nsw i32 %57, 1
store i32 %58, i32* %8
br label %59
59: ; preds = %54, %22
%60 = load i8*, i8** %7
%61 = getelementptr inbounds i8, i8* %60, i32 1
store i8* %61, i8** %7
%62 = load i8*, i8** %4
%63 = getelementptr inbounds i8, i8* %62, i32 1
store i8* %63, i8** %4
br label %12
64: ; preds = %12
%65 = load i8*, i8** %6
%66 = call i64 @strlen(i8* %65)
%67 = icmp eq i64 %66, 0
br i1 %67, label %68, label %69
68: ; preds = %64
store i32 0, i32* %3
br label %129
69: ; preds = %64
%70 = load i8*, i8** %6
%71 = call i32 @atoi(i8* %70)
%72 = load i32*, i32** %5
%73 = load i32, i32* %8
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i32, i32* %72, i64 %74
store i32 %71, i32* %75
%76 = load i32*, i32** %5
%77 = load i32, i32* %8
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds i32, i32* %76, i64 %78
%80 = load i32, i32* %79
%81 = icmp slt i32 %80, 0
br i1 %81, label %92, label %82
82: ; preds = %69
%83 = load i32*, i32** %5
%84 = load i32, i32* %8
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i32, i32* %83, i64 %85
%87 = load i32, i32* %86
%88 = icmp sgt i32 %87, 255
br i1 %88, label %92, label %89
89: ; preds = %82
%90 = load i32, i32* %8
%91 = icmp ne i32 %90, 7
br i1 %91, label %92, label %93
92: ; preds = %89, %82, %69
store i32 0, i32* %3
br label %129
93: ; preds = %89
%94 = load i32*, i32** %5
%95 = getelementptr inbounds i32, i32* %94, i64 4
%96 = load i32, i32* %95
%97 = shl i32 %96, 24
%98 = load i32*, i32** %5
%99 = getelementptr inbounds i32, i32* %98, i64 5
%100 = load i32, i32* %99
%101 = shl i32 %100, 16
%102 = or i32 %97, %101
%103 = load i32*, i32** %5
%104 = getelementptr inbounds i32, i32* %103, i64 6
%105 = load i32, i32* %104
%106 = shl i32 %105, 8
%107 = or i32 %102, %106
%108 = load i32*, i32** %5
%109 = getelementptr inbounds i32, i32* %108, i64 7
%110 = load i32, i32* %109
%111 = or i32 %107, %110
store i32 %111, i32* %9
%112 = load i32, i32* %9
%113 = icmp eq i32 %112, 0
br i1 %113, label %117, label %114
114: ; preds = %93
%115 = load i32, i32* %9
%116 = icmp eq i32 %115, -1
br i1 %116, label %117, label %118
117: ; preds = %114, %93
store i32 0, i32* %3
br label %129
118: ; preds = %114
%119 = load i32, i32* %9
%120 = xor i32 %119, -1
%121 = add nsw i32 %120, 1
%122 = load i32, i32* %9
%123 = xor i32 %122, -1
%124 = and i32 %121, %123
%125 = and i32 %124, -1
%126 = icmp ne i32 %125, 0
br i1 %126, label %127, label %128
127: ; preds = %118
store i32 0, i32* %3
br label %129
128: ; preds = %118
store i32 1, i32* %3
br label %129
129: ; preds = %128, %127, %117, %92, %68, %53, %32
%130 = load i32, i32* %3
ret i32 %130
}

LLVM IR (-O2):
define i32 @prase_ip_mask(i8* nocapture %0, i32* nocapture %1) {
br label %3
3: ; preds = %19, %2
%4 = phi i8* [ %0, %2 ], [ %20, %19 ]
%5 = phi i8* [ %0, %2 ], [ %22, %19 ]
%6 = phi i32 [ 0, %2 ], [ %21, %19 ]
%7 = load i8, i8* %5
switch i8 %7, label %19 [
i8 0, label %23
i8 46, label %8
i8 126, label %8
]
8: ; preds = %3, %3
store i8 0, i8* %5
%9 = load i8, i8* %4
%10 = icmp eq i8 %9, 0
br i1 %10, label %58, label %11
11: ; preds = %8
%12 = tail call i32 @atoi(i8* %4)
%13 = sext i32 %6 to i64
%14 = getelementptr inbounds i32, i32* %1, i64 %13
store i32 %12, i32* %14
%15 = icmp ugt i32 %12, 255
br i1 %15, label %58, label %16
16: ; preds = %11
%17 = getelementptr inbounds i8, i8* %5, i64 1
%18 = add nsw i32 %6, 1
br label %19
19: ; preds = %3, %16
%20 = phi i8* [ %17, %16 ], [ %4, %3 ]
%21 = phi i32 [ %18, %16 ], [ %6, %3 ]
%22 = getelementptr inbounds i8, i8* %5, i64 1
br label %3
23: ; preds = %3
%24 = load i8, i8* %4
%25 = icmp eq i8 %24, 0
br i1 %25, label %58, label %26
26: ; preds = %23
%27 = tail call i32 @atoi(i8* %4)
%28 = sext i32 %6 to i64
%29 = getelementptr inbounds i32, i32* %1, i64 %28
store i32 %27, i32* %29
%30 = icmp slt i32 %27, 0
br i1 %30, label %58, label %31
31: ; preds = %26
%32 = icmp ugt i32 %27, 255
%33 = icmp ne i32 %6, 7
%34 = select i1 %32, i1 true, i1 %33
br i1 %34, label %58, label %35
35: ; preds = %31
%36 = getelementptr inbounds i32, i32* %1, i64 4
%37 = load i32, i32* %36
%38 = shl i32 %37, 24
%39 = getelementptr inbounds i32, i32* %1, i64 5
%40 = load i32, i32* %39
%41 = shl i32 %40, 16
%42 = or i32 %41, %38
%43 = getelementptr inbounds i32, i32* %1, i64 6
%44 = load i32, i32* %43
%45 = shl i32 %44, 8
%46 = or i32 %42, %45
%47 = getelementptr inbounds i32, i32* %1, i64 7
%48 = load i32, i32* %47
%49 = or i32 %46, %48
%50 = add i32 %49, 1
%51 = icmp ult i32 %50, 2
br i1 %51, label %58, label %52
52: ; preds = %35
%53 = xor i32 %49, -1
%54 = sub i32 0, %49
%55 = and i32 %54, %53
%56 = icmp eq i32 %55, 0
%57 = zext i1 %56 to i32
br label %58
58: ; preds = %11, %8, %35, %52, %26, %31, %23
%59 = phi i32 [ 0, %23 ], [ 0, %31 ], [ 0, %26 ], [ 0, %35 ], [ %57, %52 ], [ 0, %8 ], [ 0, %11 ]
ret i32 %59
}