#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 uint32_t;

/* Variables and functions */
int exports_parseversion(char *verstr, uint32_t *version) {
  uint32_t vp;
  if (*verstr < '0' || *verstr > '9') {
    return -1;
  }
  vp = 0;
  while (*verstr >= '0' && *verstr <= '9') {
    vp *= 10;
    vp += *verstr - '0';
    verstr++;
  }
  if (vp > 255 || (*verstr != '.' && *verstr)) {
    return -1;
  }
  *version = vp << 16;
  if (*verstr == 0) {
    return 0;
  }
  verstr++;
  if (*verstr < '0' || *verstr > '9') {
    return -1;
  }
  vp = 0;
  while (*verstr >= '0' && *verstr <= '9') {
    vp *= 10;
    vp += *verstr - '0';
    verstr++;
  }
  if (vp > 255 || (*verstr != '.' && *verstr)) {
    return -1;
  }
  *version += vp << 8;
  if (*verstr == 0) {
    return 0;
  }
  verstr++;
  if (*verstr < '0' || *verstr > '9') {
    return -1;
  }
  vp = 0;
  while (*verstr >= '0' && *verstr <= '9') {
    vp *= 10;
    vp += *verstr - '0';
    verstr++;
  }
  if (vp > 255 || *verstr) {
    return -1;
  }
  *version += vp;
  return 0;
}


x86 assembly (clang, -O0):
<exports_parseversion>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     112c <exports_parseversion+0x2c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    1138 <exports_parseversion+0x38>
movl   $0xffffffff,-0x4(%rbp)
jmp    13d3 <exports_parseversion+0x2d3>
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x1d(%rbp)
jl     1164 <exports_parseversion+0x64>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
test   $0x1,%al
jne    1174 <exports_parseversion+0x74>
jmp    119c <exports_parseversion+0x9c>
imul   $0xa,-0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    113f <exports_parseversion+0x3f>
cmpl   $0xff,-0x1c(%rbp)
jg     11c9 <exports_parseversion+0xc9>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
je     11d5 <exports_parseversion+0xd5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     11d5 <exports_parseversion+0xd5>
movl   $0xffffffff,-0x4(%rbp)
jmp    13d3 <exports_parseversion+0x2d3>
mov    -0x1c(%rbp),%ecx
shl    $0x10,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11fd <exports_parseversion+0xfd>
movl   $0x0,-0x4(%rbp)
jmp    13d3 <exports_parseversion+0x2d3>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     1229 <exports_parseversion+0x129>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    1235 <exports_parseversion+0x135>
movl   $0xffffffff,-0x4(%rbp)
jmp    13d3 <exports_parseversion+0x2d3>
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x1e(%rbp)
jl     1261 <exports_parseversion+0x161>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x1e(%rbp)
mov    -0x1e(%rbp),%al
test   $0x1,%al
jne    1271 <exports_parseversion+0x171>
jmp    1299 <exports_parseversion+0x199>
imul   $0xa,-0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    123c <exports_parseversion+0x13c>
cmpl   $0xff,-0x1c(%rbp)
jg     12c6 <exports_parseversion+0x1c6>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
je     12d2 <exports_parseversion+0x1d2>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     12d2 <exports_parseversion+0x1d2>
movl   $0xffffffff,-0x4(%rbp)
jmp    13d3 <exports_parseversion+0x2d3>
mov    -0x1c(%rbp),%ecx
shl    $0x8,%ecx
mov    -0x18(%rbp),%rax
add    (%rax),%ecx
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    12fc <exports_parseversion+0x1fc>
movl   $0x0,-0x4(%rbp)
jmp    13d3 <exports_parseversion+0x2d3>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     1328 <exports_parseversion+0x228>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    1334 <exports_parseversion+0x234>
movl   $0xffffffff,-0x4(%rbp)
jmp    13d3 <exports_parseversion+0x2d3>
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x1f(%rbp)
jl     1360 <exports_parseversion+0x260>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x1f(%rbp)
mov    -0x1f(%rbp),%al
test   $0x1,%al
jne    1370 <exports_parseversion+0x270>
jmp    1398 <exports_parseversion+0x298>
imul   $0xa,-0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
add    -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    133b <exports_parseversion+0x23b>
cmpl   $0xff,-0x1c(%rbp)
jg     13b5 <exports_parseversion+0x2b5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     13c1 <exports_parseversion+0x2c1>
movl   $0xffffffff,-0x4(%rbp)
jmp    13d3 <exports_parseversion+0x2d3>
mov    -0x1c(%rbp),%ecx
mov    -0x18(%rbp),%rax
add    (%rax),%ecx
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<exports_parseversion>:
mov    (%rdi),%dl
lea    -0x3a(%rdx),%ecx
mov    $0xffffffff,%eax
cmp    $0xf6,%cl
jb     1202 <exports_parseversion+0x102>
add    $0x3,%rdi
xor    %r9d,%r9d
nopw   0x0(%rax,%rax,1)
movzbl %dl,%edx
lea    (%r9,%r9,4),%ecx
lea    (%rdx,%rcx,2),%r9d
add    $0xffffffd0,%r9d
movzbl -0x2(%rdi),%edx
lea    -0x30(%rdx),%ecx
add    $0x1,%rdi
cmp    $0xa,%cl
jb     1120 <exports_parseversion+0x20>
cmp    $0xff,%r9d
jg     1202 <exports_parseversion+0x102>
cmp    $0x2e,%dl
je     1159 <exports_parseversion+0x59>
test   %dl,%dl
jne    1202 <exports_parseversion+0x102>
shl    $0x10,%r9d
mov    %r9d,(%rsi)
cmpb   $0x0,-0x3(%rdi)
je     1200 <exports_parseversion+0x100>
mov    -0x2(%rdi),%dl
lea    -0x3a(%rdx),%ecx
cmp    $0xf6,%cl
jb     1202 <exports_parseversion+0x102>
xor    %r8d,%r8d
nopl   0x0(%rax)
movzbl %dl,%ecx
lea    (%r8,%r8,4),%edx
lea    (%rcx,%rdx,2),%r8d
add    $0xffffffd0,%r8d
movzbl -0x1(%rdi),%edx
lea    -0x30(%rdx),%ecx
add    $0x1,%rdi
cmp    $0xa,%cl
jb     1180 <exports_parseversion+0x80>
cmp    $0xff,%r8d
jg     1202 <exports_parseversion+0x102>
cmp    $0x2e,%dl
je     11b1 <exports_parseversion+0xb1>
test   %dl,%dl
jne    1202 <exports_parseversion+0x102>
shl    $0x8,%r8d
add    %r9d,%r8d
mov    %r8d,(%rsi)
cmpb   $0x0,-0x2(%rdi)
je     1200 <exports_parseversion+0x100>
mov    -0x1(%rdi),%dl
lea    -0x3a(%rdx),%ecx
cmp    $0xf6,%cl
jb     1202 <exports_parseversion+0x102>
xor    %r9d,%r9d
movzbl %dl,%edx
lea    (%r9,%r9,4),%ecx
lea    (%rdx,%rcx,2),%r9d
add    $0xffffffd0,%r9d
movzbl (%rdi),%edx
lea    -0x30(%rdx),%ecx
add    $0x1,%rdi
cmp    $0xa,%cl
jb     11cf <exports_parseversion+0xcf>
cmp    $0xff,%r9d
jg     1202 <exports_parseversion+0x102>
test   %dl,%dl
jne    1202 <exports_parseversion+0x102>
add    %r8d,%r9d
mov    %r9d,(%rsi)
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @exports_parseversion(i8* nocapture %0, i32* nocapture %1) {
%3 = load i8, i8* %0
%4 = add i8 %3, -58
%5 = icmp ult i8 %4, -10
br i1 %5, label %73, label %6
6: ; preds = %2, %6
%7 = phi i32 [ %13, %6 ], [ 0, %2 ]
%8 = phi i8* [ %14, %6 ], [ %0, %2 ]
%9 = phi i8 [ %15, %6 ], [ %3, %2 ]
%10 = zext i8 %9 to i32
%11 = mul nsw i32 %7, 10
%12 = add nsw i32 %10, -48
%13 = add nsw i32 %12, %11
%14 = getelementptr inbounds i8, i8* %8, i64 1
%15 = load i8, i8* %14
%16 = add i8 %15, -48
%17 = icmp ult i8 %16, 10
br i1 %17, label %6, label %18
18: ; preds = %6
%19 = icmp sgt i32 %13, 255
br i1 %19, label %73, label %20
20: ; preds = %18
switch i8 %15, label %73 [
i8 46, label %21
i8 0, label %21
]
21: ; preds = %20, %20
%22 = shl i32 %13, 16
store i32 %22, i32* %1
%23 = load i8, i8* %14
%24 = icmp eq i8 %23, 0
br i1 %24, label %73, label %25
25: ; preds = %21
%26 = getelementptr inbounds i8, i8* %8, i64 2
%27 = load i8, i8* %26
%28 = add i8 %27, -58
%29 = icmp ult i8 %28, -10
br i1 %29, label %73, label %30
30: ; preds = %25, %30
%31 = phi i32 [ %37, %30 ], [ 0, %25 ]
%32 = phi i8* [ %38, %30 ], [ %26, %25 ]
%33 = phi i8 [ %39, %30 ], [ %27, %25 ]
%34 = zext i8 %33 to i32
%35 = mul nsw i32 %31, 10
%36 = add nsw i32 %34, -48
%37 = add nsw i32 %36, %35
%38 = getelementptr inbounds i8, i8* %32, i64 1
%39 = load i8, i8* %38
%40 = add i8 %39, -48
%41 = icmp ult i8 %40, 10
br i1 %41, label %30, label %42
42: ; preds = %30
%43 = icmp sgt i32 %37, 255
br i1 %43, label %73, label %44
44: ; preds = %42
switch i8 %39, label %73 [
i8 46, label %45
i8 0, label %45
]
45: ; preds = %44, %44
%46 = shl i32 %37, 8
%47 = add nsw i32 %46, %22
store i32 %47, i32* %1
%48 = load i8, i8* %38
%49 = icmp eq i8 %48, 0
br i1 %49, label %73, label %50
50: ; preds = %45
%51 = getelementptr inbounds i8, i8* %32, i64 2
%52 = load i8, i8* %51
%53 = add i8 %52, -58
%54 = icmp ult i8 %53, -10
br i1 %54, label %73, label %55
55: ; preds = %50, %55
%56 = phi i32 [ %62, %55 ], [ 0, %50 ]
%57 = phi i8* [ %63, %55 ], [ %51, %50 ]
%58 = phi i8 [ %64, %55 ], [ %52, %50 ]
%59 = zext i8 %58 to i32
%60 = mul nsw i32 %56, 10
%61 = add nsw i32 %59, -48
%62 = add nsw i32 %61, %60
%63 = getelementptr inbounds i8, i8* %57, i64 1
%64 = load i8, i8* %63
%65 = add i8 %64, -48
%66 = icmp ult i8 %65, 10
br i1 %66, label %55, label %67
67: ; preds = %55
%68 = icmp slt i32 %62, 256
%69 = icmp eq i8 %64, 0
%70 = select i1 %68, i1 %69, i1 false
br i1 %70, label %71, label %73
71: ; preds = %67
%72 = add nsw i32 %62, %47
store i32 %72, i32* %1
br label %73
73: ; preds = %67, %50, %45, %42, %44, %25, %21, %18, %20, %2, %71
%74 = phi i32 [ 0, %71 ], [ -1, %2 ], [ -1, %20 ], [ -1, %18 ], [ 0, %21 ], [ -1, %25 ], [ -1, %44 ], [ -1, %42 ], [ 0, %45 ], [ -1, %50 ], [ -1, %67 ]
ret i32 %74
}