#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 valid_domain(const unsigned char *domain) {
  const unsigned char *ptr;
  int state;
  int n;
  int ndots;
  size_t len;
  ptr = domain;
  if (*ptr == '[') {
    ptr++;
    ndots = 0;
    state = 0;
    do {
      if (state == 0) {
        if (!((*ptr >= '0') && (*ptr <= '9'))) {
          return -1;
        }
        n = *ptr - '0';
        state = 1;
      } else {
        if (*ptr == '.') {
          if (++ndots > 3) {
            return -1;
          }
          state = 0;
        } else if (((*ptr >= '0') && (*ptr <= '9'))) {
          n = (n * 10) + (*ptr - '0');
          if (n > 255) {
            return -1;
          }
        } else if (*ptr == ']') {
          break;
        } else {
          return -1;
        }
      }
      ptr++;
    } while (1);
    if (ndots != 3) {
      return -1;
    }
    ptr++;
  } else {
    if ((!(((*ptr >= 'A') && (*ptr <= 'Z')) ||
           ((*ptr >= 'a') && (*ptr <= 'z')))) &&
        (!((*ptr >= '0') && (*ptr <= '9')))) {
      return -1;
    }
    ptr++;
    len = 1;
    state = 0;
    do {
      if (state == 0) {
        if (*ptr == '-') {
          state = 1;
        } else if (*ptr == '.') {
          state = 2;
        } else if ((!(((*ptr >= 'A') && (*ptr <= 'Z')) ||
                      ((*ptr >= 'a') && (*ptr <= 'z')))) &&
                   (!((*ptr >= '0') && (*ptr <= '9')))) {
          break;
        }
      } else if (state == 1) {
        if ((!(((*ptr >= 'A') && (*ptr <= 'Z')) ||
               ((*ptr >= 'a') && (*ptr <= 'z')))) &&
            (!((*ptr >= '0') && (*ptr <= '9')))) {
          return -1;
        }
        state = 0;
      } else {
        if ((!(((*ptr >= 'A') && (*ptr <= 'Z')) ||
               ((*ptr >= 'a') && (*ptr <= 'z')))) &&
            (!((*ptr >= '0') && (*ptr <= '9')))) {
          return -1;
        }
        state = 0;
      }
      if (++len > 255) {
        return -1;
      }
      ptr++;
    } while (1);
  }
  if (*ptr) {
    return -1;
  }
  return 0;
}


x86 assembly (clang, -O0):
<valid_domain>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5b,%eax
jne    1281 <valid_domain+0x181>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    1189 <valid_domain+0x89>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x30,%eax
jl     1164 <valid_domain+0x64>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x39,%eax
jle    1170 <valid_domain+0x70>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
sub    $0x30,%eax
mov    %eax,-0x20(%rbp)
movl   $0x1,-0x1c(%rbp)
jmp    123f <valid_domain+0x13f>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2e,%eax
jne    11c3 <valid_domain+0xc3>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
cmp    $0x3,%eax
jle    11b7 <valid_domain+0xb7>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
movl   $0x0,-0x1c(%rbp)
jmp    123a <valid_domain+0x13a>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x30,%eax
jl     1214 <valid_domain+0x114>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x39,%eax
jg     1214 <valid_domain+0x114>
imul   $0xa,-0x20(%rbp),%eax
mov    -0x18(%rbp),%rcx
movzbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0xff,-0x20(%rbp)
jle    120f <valid_domain+0x10f>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
jmp    1235 <valid_domain+0x135>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5d,%eax
jne    1229 <valid_domain+0x129>
jmp    125a <valid_domain+0x15a>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
jmp    123a <valid_domain+0x13a>
jmp    123f <valid_domain+0x13f>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    $0x1,%al
test   $0x1,%al
jne    113a <valid_domain+0x3a>
jmp    125a <valid_domain+0x15a>
cmpl   $0x3,-0x24(%rbp)
je     1270 <valid_domain+0x170>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    14fc <valid_domain+0x3fc>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x41,%eax
jl     12a1 <valid_domain+0x1a1>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5a,%eax
jle    12ed <valid_domain+0x1ed>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x61,%eax
jl     12c1 <valid_domain+0x1c1>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x7a,%eax
jle    12ed <valid_domain+0x1ed>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x30,%eax
jl     12e1 <valid_domain+0x1e1>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x39,%eax
jle    12ed <valid_domain+0x1ed>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
movq   $0x1,-0x30(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    13be <valid_domain+0x2be>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2d,%eax
jne    132e <valid_domain+0x22e>
movl   $0x1,-0x1c(%rbp)
jmp    13b9 <valid_domain+0x2b9>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2e,%eax
jne    134a <valid_domain+0x24a>
movl   $0x2,-0x1c(%rbp)
jmp    13b4 <valid_domain+0x2b4>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x41,%eax
jl     136a <valid_domain+0x26a>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5a,%eax
jle    13af <valid_domain+0x2af>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x61,%eax
jl     138a <valid_domain+0x28a>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x7a,%eax
jle    13af <valid_domain+0x2af>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x30,%eax
jl     13aa <valid_domain+0x2aa>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x39,%eax
jle    13af <valid_domain+0x2af>
jmp    14f7 <valid_domain+0x3f7>
jmp    13b4 <valid_domain+0x2b4>
jmp    13b9 <valid_domain+0x2b9>
jmp    14b8 <valid_domain+0x3b8>
cmpl   $0x1,-0x1c(%rbp)
jne    1440 <valid_domain+0x340>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x41,%eax
jl     13e8 <valid_domain+0x2e8>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5a,%eax
jle    1434 <valid_domain+0x334>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x61,%eax
jl     1408 <valid_domain+0x308>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x7a,%eax
jle    1434 <valid_domain+0x334>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x30,%eax
jl     1428 <valid_domain+0x328>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x39,%eax
jle    1434 <valid_domain+0x334>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
movl   $0x0,-0x1c(%rbp)
jmp    14b3 <valid_domain+0x3b3>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x41,%eax
jl     1460 <valid_domain+0x360>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5a,%eax
jle    14ac <valid_domain+0x3ac>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x61,%eax
jl     1480 <valid_domain+0x380>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x7a,%eax
jle    14ac <valid_domain+0x3ac>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x30,%eax
jl     14a0 <valid_domain+0x3a0>
mov    -0x18(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x39,%eax
jle    14ac <valid_domain+0x3ac>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
movl   $0x0,-0x1c(%rbp)
jmp    14b8 <valid_domain+0x3b8>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
cmp    $0xff,%rax
jbe    14dc <valid_domain+0x3dc>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    $0x1,%al
test   $0x1,%al
jne    1308 <valid_domain+0x208>
jmp    14f7 <valid_domain+0x3f7>
jmp    14fc <valid_domain+0x3fc>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1515 <valid_domain+0x415>
movl   $0xffffffff,-0x4(%rbp)
jmp    151c <valid_domain+0x41c>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<valid_domain>:
mov    (%rdi),%cl
cmp    $0x5b,%cl
jne    1165 <valid_domain+0x65>
xor    %ecx,%ecx
mov    $0x1,%sil
add    $0x1,%rdi
movzbl (%rdi),%edx
test   $0x1,%sil
jne    1130 <valid_domain+0x30>
cmp    $0x2e,%dl
jne    1140 <valid_domain+0x40>
cmp    $0x2,%ecx
jg     115f <valid_domain+0x5f>
add    $0x1,%ecx
add    $0x1,%rdi
mov    $0x1,%sil
jmp    1110 <valid_domain+0x10>
nop
lea    -0x30(%rdx),%eax
cmp    $0x9,%al
ja     115f <valid_domain+0x5f>
add    $0xffffffd0,%edx
xor    %esi,%esi
mov    %edx,%eax
jmp    110c <valid_domain+0xc>
lea    -0x30(%rdx),%esi
cmp    $0x9,%sil
ja     1246 <valid_domain+0x146>
lea    (%rax,%rax,4),%eax
lea    (%rdx,%rax,2),%eax
add    $0xffffffd0,%eax
xor    %esi,%esi
cmp    $0xff,%eax
jle    110c <valid_domain+0xc>
mov    $0xffffffff,%eax
ret
mov    %ecx,%edx
and    $0xdf,%dl
add    $0xbf,%dl
mov    $0xffffffff,%eax
cmp    $0x1a,%dl
jb     1180 <valid_domain+0x80>
add    $0xd0,%cl
cmp    $0x9,%cl
jbe    1180 <valid_domain+0x80>
ret
mov    $0x1,%ecx
xor    %esi,%esi
jmp    119d <valid_domain+0x9d>
mov    $0x2,%esi
xchg   %ax,%ax
add    $0x1,%rcx
cmp    $0x100,%rcx
je     117f <valid_domain+0x7f>
cmp    $0x1,%esi
je     11e0 <valid_domain+0xe0>
test   %esi,%esi
jne    1210 <valid_domain+0x110>
movzbl (%rdi,%rcx,1),%r8d
cmp    $0x2d,%r8b
je     123c <valid_domain+0x13c>
cmp    $0x2e,%r8b
je     1189 <valid_domain+0x89>
mov    %r8d,%edx
and    $0xdf,%dl
add    $0xbf,%dl
xor    %esi,%esi
cmp    $0x1a,%dl
jb     1190 <valid_domain+0x90>
lea    -0x30(%r8),%edx
cmp    $0xa,%dl
jb     1190 <valid_domain+0x90>
jmp    1261 <valid_domain+0x161>
nopl   0x0(%rax)
movzbl (%rdi,%rcx,1),%r8d
mov    %r8d,%edx
and    $0xdf,%dl
add    $0xbf,%dl
xor    %esi,%esi
cmp    $0x1a,%dl
jb     1190 <valid_domain+0x90>
add    $0xd0,%r8b
cmp    $0xa,%r8b
jb     1190 <valid_domain+0x90>
jmp    117f <valid_domain+0x7f>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%rdi,%rcx,1),%r8d
mov    %r8d,%edx
and    $0xdf,%dl
add    $0xbf,%dl
xor    %esi,%esi
cmp    $0x1a,%dl
jb     1190 <valid_domain+0x90>
add    $0xd0,%r8b
cmp    $0x9,%r8b
jbe    1190 <valid_domain+0x90>
jmp    117f <valid_domain+0x7f>
mov    $0x1,%esi
jmp    1190 <valid_domain+0x90>
mov    $0xffffffff,%eax
cmp    $0x5d,%dl
jne    117f <valid_domain+0x7f>
cmp    $0x3,%ecx
jne    117f <valid_domain+0x7f>
mov    0x1(%rdi),%r8b
neg    %r8b
sbb    %eax,%eax
ret

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

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