int fpattern_isvalid(const char *pat) {
  static const char specialchars[] = {'`', '-', '[', ']',    '{', '}',
                                      '?', '!', '*', '\x1A', '\0'};
  int len, open;
  char close, pch, pch2;
  unsigned char mask[256 / sizeof(unsigned char)];
  if (pat == ((void *)0))
    return (0);
  open = 0;
  for (len = 0; pat[len] != '\0'; len++) {
    switch (pat[len]) {
    case '[':
    case '{':
      if (pat[len] == '[') {
        open = 0;
        close = ']';
      } else {
        open = 1;
        close = '}';
      }
      len++;
      if (pat[len] == '!')
        len++;
      memset(mask, 0, sizeof mask);
      while (pat[len] != close) {
        pch = pat[len];
        if (pat[len] == '`') {
          len++;
          pch = pat[len];
          if ((((pch) >= '0' && (pch) <= '9') ||
               ((pch) >= 'a' && (pch) <= 'f') ||
               ((pch) >= 'A' && (pch) <= 'F'))) {
            len++;
            if (!(((pat[len]) >= '0' && (pat[len]) <= '9') ||
                  ((pat[len]) >= 'a' && (pat[len]) <= 'f') ||
                  ((pat[len]) >= 'A' && (pat[len]) <= 'F')))
              return (0);
            pch2 = pat[len];
            pch =
                ((((pch) >= '0' && (pch) <= '9')
                      ? (pch) - '0'
                      : 10 + (((pch) >= 'a' && (pch) <= 'f') ? (pch) - 'a'
                                                             : (pch) - 'A'))
                 << 4) |
                (((pch2) >= '0' && (pch2) <= '9')
                     ? (pch2) - '0'
                     : 10 + (((pch2) >= 'a' && (pch2) <= 'f') ? (pch2) - 'a'
                                                              : (pch2) - 'A'));
          } else if (strchr(specialchars, pat[len]) == ((void *)0)) {
            return (0);
          }
        }
        if (pat[len] == '\0')
          return (0);
        if (((mask)[(pch) / 8] & (1 << ((pch)&7))))
          return (0);
        ((mask)[(pch) / 8] |= (unsigned char)(1 << ((pch)&7)));
        len++;
        if (pat[len] == '-' && (pat[len + 1] != '-' || pch == '-')) {
          len++;
          if (pat[len] == '`') {
            len++;
            if ((((pat[len]) >= '0' && (pat[len]) <= '9') ||
                 ((pat[len]) >= 'a' && (pat[len]) <= 'f') ||
                 ((pat[len]) >= 'A' && (pat[len]) <= 'F'))) {
              len++;
              if (!(((pat[len]) >= '0' && (pat[len]) <= '9') ||
                    ((pat[len]) >= 'a' && (pat[len]) <= 'f') ||
                    ((pat[len]) >= 'A' && (pat[len]) <= 'F')))
                return (0);
            } else if (strchr(specialchars, pat[len]) == ((void *)0)) {
              return (0);
            }
          }
          if (pat[len] == '\0')
            return (0);
          if (len < 2 ||
              (unsigned char)pat[len - 2] > (unsigned char)pat[len] ||
              (pat[len - 2] == pat[len] && pat[len] != '-'))
            return (0);
          len++;
        }
        if (pat[len] == '\0')
          return (0);
      }
      break;
    case '`':
      len++;
      open = 0;
      if ((((pat[len]) >= '0' && (pat[len]) <= '9') ||
           ((pat[len]) >= 'a' && (pat[len]) <= 'f') ||
           ((pat[len]) >= 'A' && (pat[len]) <= 'F'))) {
        len++;
        if (!(((pat[len]) >= '0' && (pat[len]) <= '9') ||
              ((pat[len]) >= 'a' && (pat[len]) <= 'f') ||
              ((pat[len]) >= 'A' && (pat[len]) <= 'F')))
          return (0);
      } else if (strchr(specialchars, pat[len]) == ((void *)0)) {
        return (0);
      }
      if (pat[len] == '\0')
        return (0);
      break;
    case '*':
      open = 1;
      break;
    default:
      open = 0;
      break;
    }
  }
  return (open ? 2 : 1);
}


x86 assembly (clang, -O0):
<fpattern_isvalid>:
push   %rbp
mov    %rsp,%rbp
sub    $0x140,%rsp
mov    %rdi,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    1146 <fpattern_isvalid+0x26>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1978 <fpattern_isvalid+0x858>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x124(%rbp)
sub    $0x2a,%eax
je     1952 <fpattern_isvalid+0x832>
jmp    1189 <fpattern_isvalid+0x69>
mov    -0x124(%rbp),%eax
sub    $0x5b,%eax
je     11c5 <fpattern_isvalid+0xa5>
jmp    119d <fpattern_isvalid+0x7d>
mov    -0x124(%rbp),%eax
sub    $0x60,%eax
je     17d3 <fpattern_isvalid+0x6b3>
jmp    11b1 <fpattern_isvalid+0x91>
mov    -0x124(%rbp),%eax
sub    $0x7b,%eax
jne    195e <fpattern_isvalid+0x83e>
jmp    11c5 <fpattern_isvalid+0xa5>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5b,%eax
jne    11ea <fpattern_isvalid+0xca>
movl   $0x0,-0x18(%rbp)
movb   $0x5d,-0x19(%rbp)
jmp    11f5 <fpattern_isvalid+0xd5>
movl   $0x1,-0x18(%rbp)
movb   $0x7d,-0x19(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x21,%eax
jne    121c <fpattern_isvalid+0xfc>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
lea    -0x120(%rbp),%rdi
xor    %esi,%esi
mov    $0x100,%edx
call   1040 <memset@plt>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x19(%rbp),%ecx
cmp    %ecx,%eax
je     17ce <fpattern_isvalid+0x6ae>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x60,%eax
jne    14b5 <fpattern_isvalid+0x395>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1a(%rbp)
movsbl -0x1a(%rbp),%eax
cmp    $0x30,%eax
jl     129b <fpattern_isvalid+0x17b>
movsbl -0x1a(%rbp),%eax
cmp    $0x39,%eax
jle    12cf <fpattern_isvalid+0x1af>
movsbl -0x1a(%rbp),%eax
cmp    $0x61,%eax
jl     12b5 <fpattern_isvalid+0x195>
movsbl -0x1a(%rbp),%eax
cmp    $0x66,%eax
jle    12cf <fpattern_isvalid+0x1af>
movsbl -0x1a(%rbp),%eax
cmp    $0x41,%eax
jl     147d <fpattern_isvalid+0x35d>
movsbl -0x1a(%rbp),%eax
cmp    $0x46,%eax
jg     147d <fpattern_isvalid+0x35d>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1302 <fpattern_isvalid+0x1e2>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    1362 <fpattern_isvalid+0x242>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     132c <fpattern_isvalid+0x20c>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jle    1362 <fpattern_isvalid+0x242>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1356 <fpattern_isvalid+0x236>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jle    1362 <fpattern_isvalid+0x242>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x1b(%rbp)
movsbl -0x1a(%rbp),%eax
cmp    $0x30,%eax
jl     139c <fpattern_isvalid+0x27c>
movsbl -0x1a(%rbp),%eax
cmp    $0x39,%eax
jg     139c <fpattern_isvalid+0x27c>
movsbl -0x1a(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x128(%rbp)
jmp    13e4 <fpattern_isvalid+0x2c4>
movsbl -0x1a(%rbp),%eax
cmp    $0x61,%eax
jl     13c8 <fpattern_isvalid+0x2a8>
movsbl -0x1a(%rbp),%eax
cmp    $0x66,%eax
jg     13c8 <fpattern_isvalid+0x2a8>
movsbl -0x1a(%rbp),%eax
sub    $0x61,%eax
mov    %eax,-0x12c(%rbp)
jmp    13d5 <fpattern_isvalid+0x2b5>
movsbl -0x1a(%rbp),%eax
sub    $0x41,%eax
mov    %eax,-0x12c(%rbp)
mov    -0x12c(%rbp),%eax
add    $0xa,%eax
mov    %eax,-0x128(%rbp)
mov    -0x128(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0x130(%rbp)
movsbl -0x1b(%rbp),%eax
cmp    $0x30,%eax
jl     141f <fpattern_isvalid+0x2ff>
movsbl -0x1b(%rbp),%eax
cmp    $0x39,%eax
jg     141f <fpattern_isvalid+0x2ff>
movsbl -0x1b(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x134(%rbp)
jmp    1467 <fpattern_isvalid+0x347>
movsbl -0x1b(%rbp),%eax
cmp    $0x61,%eax
jl     144b <fpattern_isvalid+0x32b>
movsbl -0x1b(%rbp),%eax
cmp    $0x66,%eax
jg     144b <fpattern_isvalid+0x32b>
movsbl -0x1b(%rbp),%eax
sub    $0x61,%eax
mov    %eax,-0x138(%rbp)
jmp    1458 <fpattern_isvalid+0x338>
movsbl -0x1b(%rbp),%eax
sub    $0x41,%eax
mov    %eax,-0x138(%rbp)
mov    -0x138(%rbp),%eax
add    $0xa,%eax
mov    %eax,-0x134(%rbp)
mov    -0x130(%rbp),%eax
mov    -0x134(%rbp),%ecx
or     %ecx,%eax
mov    %al,-0x1a(%rbp)
jmp    14b0 <fpattern_isvalid+0x390>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
lea    0xb70(%rip),%rdi
call   1030 <strchr@plt>
cmp    $0x0,%rax
jne    14ab <fpattern_isvalid+0x38b>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
jmp    14b0 <fpattern_isvalid+0x390>
jmp    14b5 <fpattern_isvalid+0x395>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    14d6 <fpattern_isvalid+0x3b6>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
movsbl -0x1a(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
cltq
movzbl -0x120(%rbp,%rax,1),%eax
ff
movsbl -0x1a(%rbp),%ecx
and    $0x7,%ecx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
and    %ecx,%eax
cmp    $0x0,%eax
je     1513 <fpattern_isvalid+0x3f3>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
movsbl -0x1a(%rbp),%ecx
and    $0x7,%ecx
mov    $0x1,%eax
shl    %cl,%eax
movzbl %al,%eax
mov    %eax,-0x13c(%rbp)
movsbl -0x1a(%rbp),%eax
mov    $0x8,%ecx
cltd
idiv   %ecx
mov    -0x13c(%rbp),%edx
cltq
movzbl -0x120(%rbp,%rax,1),%ecx
ff
or     %edx,%ecx
mov    %cl,-0x120(%rbp,%rax,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    17a8 <fpattern_isvalid+0x688>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    1594 <fpattern_isvalid+0x474>
movsbl -0x1a(%rbp),%eax
cmp    $0x2d,%eax
jne    17a8 <fpattern_isvalid+0x688>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x60,%eax
jne    1709 <fpattern_isvalid+0x5e9>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     15e5 <fpattern_isvalid+0x4c5>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    1639 <fpattern_isvalid+0x519>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     160f <fpattern_isvalid+0x4ef>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jle    1639 <fpattern_isvalid+0x519>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     16d1 <fpattern_isvalid+0x5b1>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     16d1 <fpattern_isvalid+0x5b1>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     166c <fpattern_isvalid+0x54c>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    16cc <fpattern_isvalid+0x5ac>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1696 <fpattern_isvalid+0x576>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jle    16cc <fpattern_isvalid+0x5ac>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     16c0 <fpattern_isvalid+0x5a0>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jle    16cc <fpattern_isvalid+0x5ac>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
jmp    1704 <fpattern_isvalid+0x5e4>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
lea    0x91c(%rip),%rdi
call   1030 <strchr@plt>
cmp    $0x0,%rax
jne    16ff <fpattern_isvalid+0x5df>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
jmp    1704 <fpattern_isvalid+0x5e4>
jmp    1709 <fpattern_isvalid+0x5e9>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    172a <fpattern_isvalid+0x60a>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
cmpl   $0x2,-0x14(%rbp)
jl     1793 <fpattern_isvalid+0x673>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movzbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jg     1793 <fpattern_isvalid+0x673>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x2,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x10(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    179f <fpattern_isvalid+0x67f>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
je     179f <fpattern_isvalid+0x67f>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    17c9 <fpattern_isvalid+0x6a9>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
jmp    122f <fpattern_isvalid+0x10f>
jmp    1965 <fpattern_isvalid+0x845>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     180d <fpattern_isvalid+0x6ed>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    1861 <fpattern_isvalid+0x741>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1837 <fpattern_isvalid+0x717>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jle    1861 <fpattern_isvalid+0x741>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     18f9 <fpattern_isvalid+0x7d9>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jg     18f9 <fpattern_isvalid+0x7d9>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1894 <fpattern_isvalid+0x774>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    18f4 <fpattern_isvalid+0x7d4>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     18be <fpattern_isvalid+0x79e>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x66,%eax
jle    18f4 <fpattern_isvalid+0x7d4>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     18e8 <fpattern_isvalid+0x7c8>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jle    18f4 <fpattern_isvalid+0x7d4>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
jmp    192c <fpattern_isvalid+0x80c>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%esi
lea    0x6f4(%rip),%rdi
call   1030 <strchr@plt>
cmp    $0x0,%rax
jne    1927 <fpattern_isvalid+0x807>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
jmp    192c <fpattern_isvalid+0x80c>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    194d <fpattern_isvalid+0x82d>
movl   $0x0,-0x4(%rbp)
jmp    198e <fpattern_isvalid+0x86e>
jmp    1965 <fpattern_isvalid+0x845>
movl   $0x1,-0x18(%rbp)
jmp    1965 <fpattern_isvalid+0x845>
movl   $0x0,-0x18(%rbp)
jmp    196a <fpattern_isvalid+0x84a>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1154 <fpattern_isvalid+0x34>
mov    -0x18(%rbp),%edx
mov    $0x1,%eax
mov    $0x2,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x140,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fpattern_isvalid>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x118,%rsp
test   %rdi,%rdi
je     1508 <fpattern_isvalid+0x3f8>
mov    %rdi,%r15
mov    (%rdi),%al
test   %al,%al
je     1518 <fpattern_isvalid+0x408>
xor    %ebp,%ebp
xorps  %xmm0,%xmm0
movabs $0x3f0000003f,%r8
lea    0xeb3(%rip),%rdi
jmp    1167 <fpattern_isvalid+0x57>
nop
xor    %r13d,%r13d
movslq %ebp,%rbp
mov    0x1(%r15,%rbp,1),%al
add    $0x1,%rbp
test   %al,%al
je     150d <fpattern_isvalid+0x3fd>
movsbl %al,%ecx
cmp    $0x5f,%ecx
jg     1180 <fpattern_isvalid+0x70>
cmp    $0x2a,%ecx
je     1470 <fpattern_isvalid+0x360>
cmp    $0x5b,%ecx
je     118e <fpattern_isvalid+0x7e>
jmp    1150 <fpattern_isvalid+0x40>
nop
cmp    $0x60,%ecx
je     1480 <fpattern_isvalid+0x370>
cmp    $0x7b,%ecx
jne    1150 <fpattern_isvalid+0x40>
xor    %r9d,%r9d
cmp    $0x5b,%al
setne  %r9b
mov    %r9d,%r10d
shl    $0x5,%r10d
or     $0x5d,%r10d
movslq %ebp,%rax
lea    0x1(%rax),%rcx
add    $0x2,%ebp
cmpb   $0x21,0x1(%r15,%rax,1)
cmovne %ecx,%ebp
movaps %xmm0,0x100(%rsp)
movaps %xmm0,0xf0(%rsp)
movaps %xmm0,0xe0(%rsp)
movaps %xmm0,0xd0(%rsp)
movaps %xmm0,0xc0(%rsp)
movaps %xmm0,0xb0(%rsp)
movaps %xmm0,0xa0(%rsp)
movaps %xmm0,0x90(%rsp)
movaps %xmm0,0x80(%rsp)
movaps %xmm0,0x70(%rsp)
movaps %xmm0,0x60(%rsp)
movaps %xmm0,0x50(%rsp)
movaps %xmm0,0x40(%rsp)
movaps %xmm0,0x30(%rsp)
movaps %xmm0,0x20(%rsp)
movaps %xmm0,0x10(%rsp)
movslq %ebp,%rax
mov    (%r15,%rax,1),%bl
jmp    1245 <fpattern_isvalid+0x135>
nopl   0x0(%rax)
mov    %r12d,%ebp
movzbl 0x1(%r15,%rbp,1),%ebx
add    $0x1,%rbp
test   %bl,%bl
je     151e <fpattern_isvalid+0x40e>
movsbl %bl,%eax
cmp    %eax,%r10d
je     14cf <fpattern_isvalid+0x3bf>
cmp    $0x60,%bl
jne    1320 <fpattern_isvalid+0x210>
movslq %ebp,%rbp
movsbl 0x1(%r15,%rbp,1),%ebx
lea    -0x30(%rbx),%ecx
cmp    $0xa,%cl
jb     127b <fpattern_isvalid+0x16b>
lea    -0x41(%rbx),%eax
cmp    $0x25,%al
ja     12da <fpattern_isvalid+0x1ca>
movzbl %al,%eax
bt     %rax,%r8
jae    12da <fpattern_isvalid+0x1ca>
movzbl 0x2(%r15,%rbp,1),%edx
lea    -0x30(%rdx),%eax
cmp    $0xa,%al
jb     12a6 <fpattern_isvalid+0x196>
xor    %r13d,%r13d
lea    -0x41(%rdx),%esi
cmp    $0x25,%sil
ja     151e <fpattern_isvalid+0x40e>
movzbl %sil,%esi
bt     %rsi,%r8
jae    151e <fpattern_isvalid+0x40e>
cmp    $0xa,%cl
jb     12bc <fpattern_isvalid+0x1ac>
lea    -0x61(%rbx),%ecx
cmp    $0x6,%cl
setae  %cl
shl    $0x5,%cl
add    %bl,%cl
add    $0xa9,%cl
add    $0x2,%rbp
shl    $0x4,%cl
cmp    $0xa,%al
jb     12d6 <fpattern_isvalid+0x1c6>
lea    -0x61(%rdx),%eax
cmp    $0x6,%al
setae  %al
shl    $0x5,%al
add    %dl,%al
add    $0xa9,%al
or     %cl,%al
jmp    132a <fpattern_isvalid+0x21a>
mov    %r10d,0x8(%rsp)
mov    %r9d,%r13d
mov    %r8,%r14
mov    $0xb,%edx
mov    %rdi,%r12
mov    %ebx,%esi
call   1030 <memchr@plt>
test   %rax,%rax
je     1508 <fpattern_isvalid+0x3f8>
add    $0x1,%rbp
xorps  %xmm0,%xmm0
mov    %r14,%r8
mov    %r12,%rdi
mov    %r13d,%r9d
mov    0x8(%rsp),%r10d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %ebx,%eax
test   %bl,%bl
je     1508 <fpattern_isvalid+0x3f8>
mov    %eax,%ecx
sar    $0x7,%cl
shr    $0x5,%cl
add    %al,%cl
sar    $0x3,%cl
movsbq %cl,%rdx
mov    %eax,%ecx
and    $0x7,%cl
mov    $0x1,%esi
shl    %cl,%esi
movzbl 0x10(%rsp,%rdx,1),%ebx
movzbl %cl,%ecx
xor    %r13d,%r13d
bt     %ecx,%ebx
jb     151e <fpattern_isvalid+0x40e>
or     %bl,%sil
mov    %sil,0x10(%rsp,%rdx,1)
movslq %ebp,%r12
lea    0x1(%r12),%rbp
movzbl 0x1(%r15,%r12,1),%ebx
cmp    $0x2d,%bl
jne    123d <fpattern_isvalid+0x12d>
movzbl 0x2(%r15,%r12,1),%r14d
cmp    $0x2d,%r14b
jne    1390 <fpattern_isvalid+0x280>
mov    $0x2d,%bl
cmp    $0x2d,%al
jne    123d <fpattern_isvalid+0x12d>
cmp    $0x60,%r14b
jne    13e2 <fpattern_isvalid+0x2d2>
movzbl 0x3(%r15,%r12,1),%r14d
lea    -0x30(%r14),%eax
cmp    $0xa,%al
jb     13b5 <fpattern_isvalid+0x2a5>
lea    -0x41(%r14),%eax
cmp    $0x25,%al
ja     1424 <fpattern_isvalid+0x314>
movzbl %al,%eax
bt     %rax,%r8
jae    1424 <fpattern_isvalid+0x314>
movzbl 0x4(%r15,%r12,1),%r14d
add    $0x4,%r12
lea    -0x30(%r14),%eax
cmp    $0xa,%al
jb     13e6 <fpattern_isvalid+0x2d6>
mov    %r14d,%eax
add    $0xbf,%al
cmp    $0x25,%al
ja     151e <fpattern_isvalid+0x40e>
movzbl %al,%eax
bt     %rax,%r8
jb     13e6 <fpattern_isvalid+0x2d6>
jmp    151e <fpattern_isvalid+0x40e>
add    $0x2,%r12
test   %r14b,%r14b
je     151e <fpattern_isvalid+0x40e>
cmp    $0x2,%r12d
jl     151e <fpattern_isvalid+0x40e>
lea    -0x2(%r12),%eax
movzbl (%r15,%rax,1),%eax
cmp    %r14b,%al
ja     151e <fpattern_isvalid+0x40e>
cmp    $0x2d,%r14b
je     1230 <fpattern_isvalid+0x120>
cmp    %r14b,%al
jne    1230 <fpattern_isvalid+0x120>
jmp    151e <fpattern_isvalid+0x40e>
mov    %r10d,0x8(%rsp)
mov    %r9d,0xc(%rsp)
mov    %r8,%rbx
movsbl %r14b,%esi
mov    $0xb,%edx
mov    %rdi,%rbp
call   1030 <memchr@plt>
test   %rax,%rax
je     151e <fpattern_isvalid+0x40e>
add    $0x3,%r12
xorps  %xmm0,%xmm0
mov    %rbx,%r8
mov    %rbp,%rdi
mov    0xc(%rsp),%r9d
mov    0x8(%rsp),%r10d
test   %r14b,%r14b
jne    13ef <fpattern_isvalid+0x2df>
jmp    151e <fpattern_isvalid+0x40e>
nopl   0x0(%rax)
mov    $0x1,%r13d
jmp    1153 <fpattern_isvalid+0x43>
nopl   0x0(%rax,%rax,1)
movslq %ebp,%rbp
mov    0x1(%r15,%rbp,1),%bl
lea    -0x30(%rbx),%eax
cmp    $0xa,%al
jb     149f <fpattern_isvalid+0x38f>
lea    -0x41(%rbx),%eax
cmp    $0x25,%al
ja     14d7 <fpattern_isvalid+0x3c7>
movzbl %al,%eax
bt     %rax,%r8
jae    14d7 <fpattern_isvalid+0x3c7>
mov    0x2(%r15,%rbp,1),%al
add    $0x2,%rbp
lea    -0x30(%rax),%ecx
xor    %r13d,%r13d
cmp    $0xa,%cl
jb     1153 <fpattern_isvalid+0x43>
xor    %r13d,%r13d
add    $0xbf,%al
cmp    $0x25,%al
ja     151e <fpattern_isvalid+0x40e>
movzbl %al,%eax
bt     %rax,%r8
jb     1153 <fpattern_isvalid+0x43>
jmp    151e <fpattern_isvalid+0x40e>
mov    %r9d,%r13d
jmp    1153 <fpattern_isvalid+0x43>
mov    %r8,%r14
movsbl %bl,%esi
mov    $0xb,%edx
mov    %rdi,%r12
call   1030 <memchr@plt>
xor    %r13d,%r13d
test   %rax,%rax
je     151e <fpattern_isvalid+0x40e>
test   %bl,%bl
je     151e <fpattern_isvalid+0x40e>
add    $0x1,%rbp
xorps  %xmm0,%xmm0
mov    %r14,%r8
mov    %r12,%rdi
jmp    1153 <fpattern_isvalid+0x43>
xor    %r13d,%r13d
jmp    151e <fpattern_isvalid+0x40e>
test   %r13d,%r13d
mov    $0x2,%r13d
jne    151e <fpattern_isvalid+0x40e>
mov    $0x1,%r13d
mov    %r13d,%eax
add    $0x118,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@fpattern_isvalid.specialchars = internal constant [11 x i8] c"`-[]{}?!*\1A\00"
define i32 @fpattern_isvalid(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i8
%7 = alloca i8
%8 = alloca i8
%9 = alloca [256 x i8]
store i8* %0, i8** %3
%10 = load i8*, i8** %3
%11 = icmp eq i8* %10, null
br i1 %11, label %12, label %13
12: ; preds = %1
store i32 0, i32* %2
br label %629
13: ; preds = %1
store i32 0, i32* %5
store i32 0, i32* %4
br label %14
14: ; preds = %621, %13
%15 = load i8*, i8** %3
%16 = load i32, i32* %4
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i8, i8* %15, i64 %17
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = icmp ne i32 %20, 0
br i1 %21, label %22, label %624
22: ; preds = %14
%23 = load i8*, i8** %3
%24 = load i32, i32* %4
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %23, i64 %25
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
switch i32 %28, label %619 [
i32 91, label %29
i32 123, label %29
i32 96, label %495
i32 42, label %618
]
29: ; preds = %22, %22
%30 = load i8*, i8** %3
%31 = load i32, i32* %4
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i8, i8* %30, i64 %32
%34 = load i8, i8* %33
%35 = sext i8 %34 to i32
%36 = icmp eq i32 %35, 91
br i1 %36, label %37, label %38
37: ; preds = %29
store i32 0, i32* %5
store i8 93, i8* %6
br label %39
38: ; preds = %29
store i32 1, i32* %5
store i8 125, i8* %6
br label %39
39: ; preds = %38, %37
%40 = load i32, i32* %4
%41 = add nsw i32 %40, 1
store i32 %41, i32* %4
%42 = load i8*, i8** %3
%43 = load i32, i32* %4
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i8, i8* %42, i64 %44
%46 = load i8, i8* %45
%47 = sext i8 %46 to i32
%48 = icmp eq i32 %47, 33
br i1 %48, label %49, label %52
49: ; preds = %39
%50 = load i32, i32* %4
%51 = add nsw i32 %50, 1
store i32 %51, i32* %4
br label %52
52: ; preds = %49, %39
%53 = getelementptr inbounds [256 x i8], [256 x i8]* %9, i64 0, i64 0
br label %54
54: ; preds = %493, %52
%55 = load i8*, i8** %3
%56 = load i32, i32* %4
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds i8, i8* %55, i64 %57
%59 = load i8, i8* %58
%60 = sext i8 %59 to i32
%61 = load i8, i8* %6
%62 = sext i8 %61 to i32
%63 = icmp ne i32 %60, %62
br i1 %63, label %64, label %494
64: ; preds = %54
%65 = load i8*, i8** %3
%66 = load i32, i32* %4
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i8, i8* %65, i64 %67
%69 = load i8, i8* %68
store i8 %69, i8* %7
%70 = load i8*, i8** %3
%71 = load i32, i32* %4
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds i8, i8* %70, i64 %72
%74 = load i8, i8* %73
%75 = sext i8 %74 to i32
%76 = icmp eq i32 %75, 96
br i1 %76, label %77, label %244
77: ; preds = %64
%78 = load i32, i32* %4
%79 = add nsw i32 %78, 1
store i32 %79, i32* %4
%80 = load i8*, i8** %3
%81 = load i32, i32* %4
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i8, i8* %80, i64 %82
%84 = load i8, i8* %83
store i8 %84, i8* %7
%85 = load i8, i8* %7
%86 = sext i8 %85 to i32
%87 = icmp sge i32 %86, 48
br i1 %87, label %88, label %92
88: ; preds = %77
%89 = load i8, i8* %7
%90 = sext i8 %89 to i32
%91 = icmp sle i32 %90, 57
br i1 %91, label %108, label %92
92: ; preds = %88, %77
%93 = load i8, i8* %7
%94 = sext i8 %93 to i32
%95 = icmp sge i32 %94, 97
br i1 %95, label %96, label %100
96: ; preds = %92
%97 = load i8, i8* %7
%98 = sext i8 %97 to i32
%99 = icmp sle i32 %98, 102
br i1 %99, label %108, label %100
100: ; preds = %96, %92
%101 = load i8, i8* %7
%102 = sext i8 %101 to i32
%103 = icmp sge i32 %102, 65
br i1 %103, label %104, label %232
104: ; preds = %100
%105 = load i8, i8* %7
%106 = sext i8 %105 to i32
%107 = icmp sle i32 %106, 70
br i1 %107, label %108, label %232
108: ; preds = %104, %96, %88
%109 = load i32, i32* %4
%110 = add nsw i32 %109, 1
store i32 %110, i32* %4
%111 = load i8*, i8** %3
%112 = load i32, i32* %4
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds i8, i8* %111, i64 %113
%115 = load i8, i8* %114
%116 = sext i8 %115 to i32
%117 = icmp sge i32 %116, 48
br i1 %117, label %118, label %126
118: ; preds = %108
%119 = load i8*, i8** %3
%120 = load i32, i32* %4
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %119, i64 %121
%123 = load i8, i8* %122
%124 = sext i8 %123 to i32
%125 = icmp sle i32 %124, 57
br i1 %125, label %159, label %126
126: ; preds = %118, %108
%127 = load i8*, i8** %3
%128 = load i32, i32* %4
%129 = sext i32 %128 to i64
%130 = getelementptr inbounds i8, i8* %127, i64 %129
%131 = load i8, i8* %130
%132 = sext i8 %131 to i32
%133 = icmp sge i32 %132, 97
br i1 %133, label %134, label %142
134: ; preds = %126
%135 = load i8*, i8** %3
%136 = load i32, i32* %4
%137 = sext i32 %136 to i64
%138 = getelementptr inbounds i8, i8* %135, i64 %137
%139 = load i8, i8* %138
%140 = sext i8 %139 to i32
%141 = icmp sle i32 %140, 102
br i1 %141, label %159, label %142
142: ; preds = %134, %126
%143 = load i8*, i8** %3
%144 = load i32, i32* %4
%145 = sext i32 %144 to i64
%146 = getelementptr inbounds i8, i8* %143, i64 %145
%147 = load i8, i8* %146
%148 = sext i8 %147 to i32
%149 = icmp sge i32 %148, 65
br i1 %149, label %150, label %158
150: ; preds = %142
%151 = load i8*, i8** %3
%152 = load i32, i32* %4
%153 = sext i32 %152 to i64
%154 = getelementptr inbounds i8, i8* %151, i64 %153
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = icmp sle i32 %156, 70
br i1 %157, label %159, label %158
158: ; preds = %150, %142
store i32 0, i32* %2
br label %629
159: ; preds = %150, %134, %118
%160 = load i8*, i8** %3
%161 = load i32, i32* %4
%162 = sext i32 %161 to i64
%163 = getelementptr inbounds i8, i8* %160, i64 %162
%164 = load i8, i8* %163
store i8 %164, i8* %8
%165 = load i8, i8* %7
%166 = sext i8 %165 to i32
%167 = icmp sge i32 %166, 48
br i1 %167, label %168, label %176
168: ; preds = %159
%169 = load i8, i8* %7
%170 = sext i8 %169 to i32
%171 = icmp sle i32 %170, 57
br i1 %171, label %172, label %176
172: ; preds = %168
%173 = load i8, i8* %7
%174 = sext i8 %173 to i32
%175 = sub nsw i32 %174, 48
br label %195
176: ; preds = %168, %159
%177 = load i8, i8* %7
%178 = sext i8 %177 to i32
%179 = icmp sge i32 %178, 97
br i1 %179, label %180, label %188
180: ; preds = %176
%181 = load i8, i8* %7
%182 = sext i8 %181 to i32
%183 = icmp sle i32 %182, 102
br i1 %183, label %184, label %188
184: ; preds = %180
%185 = load i8, i8* %7
%186 = sext i8 %185 to i32
%187 = sub nsw i32 %186, 97
br label %192
188: ; preds = %180, %176
%189 = load i8, i8* %7
%190 = sext i8 %189 to i32
%191 = sub nsw i32 %190, 65
br label %192
192: ; preds = %188, %184
%193 = phi i32 [ %187, %184 ], [ %191, %188 ]
%194 = add nsw i32 10, %193
br label %195
195: ; preds = %192, %172
%196 = phi i32 [ %175, %172 ], [ %194, %192 ]
%197 = shl i32 %196, 4
%198 = load i8, i8* %8
%199 = sext i8 %198 to i32
%200 = icmp sge i32 %199, 48
br i1 %200, label %201, label %209
201: ; preds = %195
%202 = load i8, i8* %8
%203 = sext i8 %202 to i32
%204 = icmp sle i32 %203, 57
br i1 %204, label %205, label %209
205: ; preds = %201
%206 = load i8, i8* %8
%207 = sext i8 %206 to i32
%208 = sub nsw i32 %207, 48
br label %228
209: ; preds = %201, %195
%210 = load i8, i8* %8
%211 = sext i8 %210 to i32
%212 = icmp sge i32 %211, 97
br i1 %212, label %213, label %221
213: ; preds = %209
%214 = load i8, i8* %8
%215 = sext i8 %214 to i32
%216 = icmp sle i32 %215, 102
br i1 %216, label %217, label %221
217: ; preds = %213
%218 = load i8, i8* %8
%219 = sext i8 %218 to i32
%220 = sub nsw i32 %219, 97
br label %225
221: ; preds = %213, %209
%222 = load i8, i8* %8
%223 = sext i8 %222 to i32
%224 = sub nsw i32 %223, 65
br label %225
225: ; preds = %221, %217
%226 = phi i32 [ %220, %217 ], [ %224, %221 ]
%227 = add nsw i32 10, %226
br label %228
228: ; preds = %225, %205
%229 = phi i32 [ %208, %205 ], [ %227, %225 ]
%230 = or i32 %197, %229
%231 = trunc i32 %230 to i8
store i8 %231, i8* %7
br label %243
232: ; preds = %104, %100
%233 = load i8*, i8** %3
%234 = load i32, i32* %4
%235 = sext i32 %234 to i64
%236 = getelementptr inbounds i8, i8* %233, i64 %235
%237 = load i8, i8* %236
%238 = sext i8 %237 to i32
%239 = call i8* @strchr(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @fpattern_isvalid.specialchars, i64 0, i64 0), i32 %238)
%240 = icmp eq i8* %239, null
br i1 %240, label %241, label %242
241: ; preds = %232
store i32 0, i32* %2
br label %629
242: ; preds = %232
br label %243
243: ; preds = %242, %228
br label %244
244: ; preds = %243, %64
%245 = load i8*, i8** %3
%246 = load i32, i32* %4
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds i8, i8* %245, i64 %247
%249 = load i8, i8* %248
%250 = sext i8 %249 to i32
%251 = icmp eq i32 %250, 0
br i1 %251, label %252, label %253
252: ; preds = %244
store i32 0, i32* %2
br label %629
253: ; preds = %244
%254 = load i8, i8* %7
%255 = sext i8 %254 to i32
%256 = sdiv i32 %255, 8
%257 = sext i32 %256 to i64
%258 = getelementptr inbounds [256 x i8], [256 x i8]* %9, i64 0, i64 %257
%259 = load i8, i8* %258
%260 = zext i8 %259 to i32
%261 = load i8, i8* %7
%262 = sext i8 %261 to i32
%263 = and i32 %262, 7
%264 = shl i32 1, %263
%265 = and i32 %260, %264
%266 = icmp ne i32 %265, 0
br i1 %266, label %267, label %268
267: ; preds = %253
store i32 0, i32* %2
br label %629
268: ; preds = %253
%269 = load i8, i8* %7
%270 = sext i8 %269 to i32
%271 = and i32 %270, 7
%272 = shl i32 1, %271
%273 = trunc i32 %272 to i8
%274 = zext i8 %273 to i32
%275 = load i8, i8* %7
%276 = sext i8 %275 to i32
%277 = sdiv i32 %276, 8
%278 = sext i32 %277 to i64
%279 = getelementptr inbounds [256 x i8], [256 x i8]* %9, i64 0, i64 %278
%280 = load i8, i8* %279
%281 = zext i8 %280 to i32
%282 = or i32 %281, %274
%283 = trunc i32 %282 to i8
store i8 %283, i8* %279
%284 = load i32, i32* %4
%285 = add nsw i32 %284, 1
store i32 %285, i32* %4
%286 = load i8*, i8** %3
%287 = load i32, i32* %4
%288 = sext i32 %287 to i64
%289 = getelementptr inbounds i8, i8* %286, i64 %288
%290 = load i8, i8* %289
%291 = sext i8 %290 to i32
%292 = icmp eq i32 %291, 45
br i1 %292, label %293, label %484
293: ; preds = %268
%294 = load i8*, i8** %3
%295 = load i32, i32* %4
%296 = add nsw i32 %295, 1
%297 = sext i32 %296 to i64
%298 = getelementptr inbounds i8, i8* %294, i64 %297
%299 = load i8, i8* %298
%300 = sext i8 %299 to i32
%301 = icmp ne i32 %300, 45
br i1 %301, label %306, label %302
302: ; preds = %293
%303 = load i8, i8* %7
%304 = sext i8 %303 to i32
%305 = icmp eq i32 %304, 45
br i1 %305, label %306, label %484
306: ; preds = %302, %293
%307 = load i32, i32* %4
%308 = add nsw i32 %307, 1
store i32 %308, i32* %4
%309 = load i8*, i8** %3
%310 = load i32, i32* %4
%311 = sext i32 %310 to i64
%312 = getelementptr inbounds i8, i8* %309, i64 %311
%313 = load i8, i8* %312
%314 = sext i8 %313 to i32
%315 = icmp eq i32 %314, 96
br i1 %315, label %316, label %430
316: ; preds = %306
%317 = load i32, i32* %4
%318 = add nsw i32 %317, 1
store i32 %318, i32* %4
%319 = load i8*, i8** %3
%320 = load i32, i32* %4
%321 = sext i32 %320 to i64
%322 = getelementptr inbounds i8, i8* %319, i64 %321
%323 = load i8, i8* %322
%324 = sext i8 %323 to i32
%325 = icmp sge i32 %324, 48
br i1 %325, label %326, label %334
326: ; preds = %316
%327 = load i8*, i8** %3
%328 = load i32, i32* %4
%329 = sext i32 %328 to i64
%330 = getelementptr inbounds i8, i8* %327, i64 %329
%331 = load i8, i8* %330
%332 = sext i8 %331 to i32
%333 = icmp sle i32 %332, 57
br i1 %333, label %366, label %334
334: ; preds = %326, %316
%335 = load i8*, i8** %3
%336 = load i32, i32* %4
%337 = sext i32 %336 to i64
%338 = getelementptr inbounds i8, i8* %335, i64 %337
%339 = load i8, i8* %338
%340 = sext i8 %339 to i32
%341 = icmp sge i32 %340, 97
br i1 %341, label %342, label %350
342: ; preds = %334
%343 = load i8*, i8** %3
%344 = load i32, i32* %4
%345 = sext i32 %344 to i64
%346 = getelementptr inbounds i8, i8* %343, i64 %345
%347 = load i8, i8* %346
%348 = sext i8 %347 to i32
%349 = icmp sle i32 %348, 102
br i1 %349, label %366, label %350
350: ; preds = %342, %334
%351 = load i8*, i8** %3
%352 = load i32, i32* %4
%353 = sext i32 %352 to i64
%354 = getelementptr inbounds i8, i8* %351, i64 %353
%355 = load i8, i8* %354
%356 = sext i8 %355 to i32
%357 = icmp sge i32 %356, 65
br i1 %357, label %358, label %418
358: ; preds = %350
%359 = load i8*, i8** %3
%360 = load i32, i32* %4
%361 = sext i32 %360 to i64
%362 = getelementptr inbounds i8, i8* %359, i64 %361
%363 = load i8, i8* %362
%364 = sext i8 %363 to i32
%365 = icmp sle i32 %364, 70
br i1 %365, label %366, label %418
366: ; preds = %358, %342, %326
%367 = load i32, i32* %4
%368 = add nsw i32 %367, 1
store i32 %368, i32* %4
%369 = load i8*, i8** %3
%370 = load i32, i32* %4
%371 = sext i32 %370 to i64
%372 = getelementptr inbounds i8, i8* %369, i64 %371
%373 = load i8, i8* %372
%374 = sext i8 %373 to i32
%375 = icmp sge i32 %374, 48
br i1 %375, label %376, label %384
376: ; preds = %366
%377 = load i8*, i8** %3
%378 = load i32, i32* %4
%379 = sext i32 %378 to i64
%380 = getelementptr inbounds i8, i8* %377, i64 %379
%381 = load i8, i8* %380
%382 = sext i8 %381 to i32
%383 = icmp sle i32 %382, 57
br i1 %383, label %417, label %384
384: ; preds = %376, %366
%385 = load i8*, i8** %3
%386 = load i32, i32* %4
%387 = sext i32 %386 to i64
%388 = getelementptr inbounds i8, i8* %385, i64 %387
%389 = load i8, i8* %388
%390 = sext i8 %389 to i32
%391 = icmp sge i32 %390, 97
br i1 %391, label %392, label %400
392: ; preds = %384
%393 = load i8*, i8** %3
%394 = load i32, i32* %4
%395 = sext i32 %394 to i64
%396 = getelementptr inbounds i8, i8* %393, i64 %395
%397 = load i8, i8* %396
%398 = sext i8 %397 to i32
%399 = icmp sle i32 %398, 102
br i1 %399, label %417, label %400
400: ; preds = %392, %384
%401 = load i8*, i8** %3
%402 = load i32, i32* %4
%403 = sext i32 %402 to i64
%404 = getelementptr inbounds i8, i8* %401, i64 %403
%405 = load i8, i8* %404
%406 = sext i8 %405 to i32
%407 = icmp sge i32 %406, 65
br i1 %407, label %408, label %416
408: ; preds = %400
%409 = load i8*, i8** %3
%410 = load i32, i32* %4
%411 = sext i32 %410 to i64
%412 = getelementptr inbounds i8, i8* %409, i64 %411
%413 = load i8, i8* %412
%414 = sext i8 %413 to i32
%415 = icmp sle i32 %414, 70
br i1 %415, label %417, label %416
416: ; preds = %408, %400
store i32 0, i32* %2
br label %629
417: ; preds = %408, %392, %376
br label %429
418: ; preds = %358, %350
%419 = load i8*, i8** %3
%420 = load i32, i32* %4
%421 = sext i32 %420 to i64
%422 = getelementptr inbounds i8, i8* %419, i64 %421
%423 = load i8, i8* %422
%424 = sext i8 %423 to i32
%425 = call i8* @strchr(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @fpattern_isvalid.specialchars, i64 0, i64 0), i32 %424)
%426 = icmp eq i8* %425, null
br i1 %426, label %427, label %428
427: ; preds = %418
store i32 0, i32* %2
br label %629
428: ; preds = %418
br label %429
429: ; preds = %428, %417
br label %430
430: ; preds = %429, %306
%431 = load i8*, i8** %3
%432 = load i32, i32* %4
%433 = sext i32 %432 to i64
%434 = getelementptr inbounds i8, i8* %431, i64 %433
%435 = load i8, i8* %434
%436 = sext i8 %435 to i32
%437 = icmp eq i32 %436, 0
br i1 %437, label %438, label %439
438: ; preds = %430
store i32 0, i32* %2
br label %629
439: ; preds = %430
%440 = load i32, i32* %4
%441 = icmp slt i32 %440, 2
br i1 %441, label %480, label %442
442: ; preds = %439
%443 = load i8*, i8** %3
%444 = load i32, i32* %4
%445 = sub nsw i32 %444, 2
%446 = sext i32 %445 to i64
%447 = getelementptr inbounds i8, i8* %443, i64 %446
%448 = load i8, i8* %447
%449 = zext i8 %448 to i32
%450 = load i8*, i8** %3
%451 = load i32, i32* %4
%452 = sext i32 %451 to i64
%453 = getelementptr inbounds i8, i8* %450, i64 %452
%454 = load i8, i8* %453
%455 = zext i8 %454 to i32
%456 = icmp sgt i32 %449, %455
br i1 %456, label %480, label %457
457: ; preds = %442
%458 = load i8*, i8** %3
%459 = load i32, i32* %4
%460 = sub nsw i32 %459, 2
%461 = sext i32 %460 to i64
%462 = getelementptr inbounds i8, i8* %458, i64 %461
%463 = load i8, i8* %462
%464 = sext i8 %463 to i32
%465 = load i8*, i8** %3
%466 = load i32, i32* %4
%467 = sext i32 %466 to i64
%468 = getelementptr inbounds i8, i8* %465, i64 %467
%469 = load i8, i8* %468
%470 = sext i8 %469 to i32
%471 = icmp eq i32 %464, %470
br i1 %471, label %472, label %481
472: ; preds = %457
%473 = load i8*, i8** %3
%474 = load i32, i32* %4
%475 = sext i32 %474 to i64
%476 = getelementptr inbounds i8, i8* %473, i64 %475
%477 = load i8, i8* %476
%478 = sext i8 %477 to i32
%479 = icmp ne i32 %478, 45
br i1 %479, label %480, label %481
480: ; preds = %472, %442, %439
store i32 0, i32* %2
br label %629
481: ; preds = %472, %457
%482 = load i32, i32* %4
%483 = add nsw i32 %482, 1
store i32 %483, i32* %4
br label %484
484: ; preds = %481, %302, %268
%485 = load i8*, i8** %3
%486 = load i32, i32* %4
%487 = sext i32 %486 to i64
%488 = getelementptr inbounds i8, i8* %485, i64 %487
%489 = load i8, i8* %488
%490 = sext i8 %489 to i32
%491 = icmp eq i32 %490, 0
br i1 %491, label %492, label %493
492: ; preds = %484
store i32 0, i32* %2
br label %629
493: ; preds = %484
br label %54
494: ; preds = %54
br label %620
495: ; preds = %22
%496 = load i32, i32* %4
%497 = add nsw i32 %496, 1
store i32 %497, i32* %4
store i32 0, i32* %5
%498 = load i8*, i8** %3
%499 = load i32, i32* %4
%500 = sext i32 %499 to i64
%501 = getelementptr inbounds i8, i8* %498, i64 %500
%502 = load i8, i8* %501
%503 = sext i8 %502 to i32
%504 = icmp sge i32 %503, 48
br i1 %504, label %505, label %513
505: ; preds = %495
%506 = load i8*, i8** %3
%507 = load i32, i32* %4
%508 = sext i32 %507 to i64
%509 = getelementptr inbounds i8, i8* %506, i64 %508
%510 = load i8, i8* %509
%511 = sext i8 %510 to i32
%512 = icmp sle i32 %511, 57
br i1 %512, label %545, label %513
513: ; preds = %505, %495
%514 = load i8*, i8** %3
%515 = load i32, i32* %4
%516 = sext i32 %515 to i64
%517 = getelementptr inbounds i8, i8* %514, i64 %516
%518 = load i8, i8* %517
%519 = sext i8 %518 to i32
%520 = icmp sge i32 %519, 97
br i1 %520, label %521, label %529
521: ; preds = %513
%522 = load i8*, i8** %3
%523 = load i32, i32* %4
%524 = sext i32 %523 to i64
%525 = getelementptr inbounds i8, i8* %522, i64 %524
%526 = load i8, i8* %525
%527 = sext i8 %526 to i32
%528 = icmp sle i32 %527, 102
br i1 %528, label %545, label %529
529: ; preds = %521, %513
%530 = load i8*, i8** %3
%531 = load i32, i32* %4
%532 = sext i32 %531 to i64
%533 = getelementptr inbounds i8, i8* %530, i64 %532
%534 = load i8, i8* %533
%535 = sext i8 %534 to i32
%536 = icmp sge i32 %535, 65
br i1 %536, label %537, label %597
537: ; preds = %529
%538 = load i8*, i8** %3
%539 = load i32, i32* %4
%540 = sext i32 %539 to i64
%541 = getelementptr inbounds i8, i8* %538, i64 %540
%542 = load i8, i8* %541
%543 = sext i8 %542 to i32
%544 = icmp sle i32 %543, 70
br i1 %544, label %545, label %597
545: ; preds = %537, %521, %505
%546 = load i32, i32* %4
%547 = add nsw i32 %546, 1
store i32 %547, i32* %4
%548 = load i8*, i8** %3
%549 = load i32, i32* %4
%550 = sext i32 %549 to i64
%551 = getelementptr inbounds i8, i8* %548, i64 %550
%552 = load i8, i8* %551
%553 = sext i8 %552 to i32
%554 = icmp sge i32 %553, 48
br i1 %554, label %555, label %563
555: ; preds = %545
%556 = load i8*, i8** %3
%557 = load i32, i32* %4
%558 = sext i32 %557 to i64
%559 = getelementptr inbounds i8, i8* %556, i64 %558
%560 = load i8, i8* %559
%561 = sext i8 %560 to i32
%562 = icmp sle i32 %561, 57
br i1 %562, label %596, label %563
563: ; preds = %555, %545
%564 = load i8*, i8** %3
%565 = load i32, i32* %4
%566 = sext i32 %565 to i64
%567 = getelementptr inbounds i8, i8* %564, i64 %566
%568 = load i8, i8* %567
%569 = sext i8 %568 to i32
%570 = icmp sge i32 %569, 97
br i1 %570, label %571, label %579
571: ; preds = %563
%572 = load i8*, i8** %3
%573 = load i32, i32* %4
%574 = sext i32 %573 to i64
%575 = getelementptr inbounds i8, i8* %572, i64 %574
%576 = load i8, i8* %575
%577 = sext i8 %576 to i32
%578 = icmp sle i32 %577, 102
br i1 %578, label %596, label %579
579: ; preds = %571, %563
%580 = load i8*, i8** %3
%581 = load i32, i32* %4
%582 = sext i32 %581 to i64
%583 = getelementptr inbounds i8, i8* %580, i64 %582
%584 = load i8, i8* %583
%585 = sext i8 %584 to i32
%586 = icmp sge i32 %585, 65
br i1 %586, label %587, label %595
587: ; preds = %579
%588 = load i8*, i8** %3
%589 = load i32, i32* %4
%590 = sext i32 %589 to i64
%591 = getelementptr inbounds i8, i8* %588, i64 %590
%592 = load i8, i8* %591
%593 = sext i8 %592 to i32
%594 = icmp sle i32 %593, 70
br i1 %594, label %596, label %595
595: ; preds = %587, %579
store i32 0, i32* %2
br label %629
596: ; preds = %587, %571, %555
br label %608
597: ; preds = %537, %529
%598 = load i8*, i8** %3
%599 = load i32, i32* %4
%600 = sext i32 %599 to i64
%601 = getelementptr inbounds i8, i8* %598, i64 %600
%602 = load i8, i8* %601
%603 = sext i8 %602 to i32
%604 = call i8* @strchr(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @fpattern_isvalid.specialchars, i64 0, i64 0), i32 %603)
%605 = icmp eq i8* %604, null
br i1 %605, label %606, label %607
606: ; preds = %597
store i32 0, i32* %2
br label %629
607: ; preds = %597
br label %608
608: ; preds = %607, %596
%609 = load i8*, i8** %3
%610 = load i32, i32* %4
%611 = sext i32 %610 to i64
%612 = getelementptr inbounds i8, i8* %609, i64 %611
%613 = load i8, i8* %612
%614 = sext i8 %613 to i32
%615 = icmp eq i32 %614, 0
br i1 %615, label %616, label %617
616: ; preds = %608
store i32 0, i32* %2
br label %629
617: ; preds = %608
br label %620
618: ; preds = %22
store i32 1, i32* %5
br label %620
619: ; preds = %22
store i32 0, i32* %5
br label %620
620: ; preds = %619, %618, %617, %494
br label %621
621: ; preds = %620
%622 = load i32, i32* %4
%623 = add nsw i32 %622, 1
store i32 %623, i32* %4
br label %14
624: ; preds = %14
%625 = load i32, i32* %5
%626 = icmp ne i32 %625, 0
%627 = zext i1 %626 to i64
%628 = select i1 %626, i32 2, i32 1
store i32 %628, i32* %2
br label %629
629: ; preds = %624, %616, %606, %595, %492, %480, %438, %427, %416, %267, %252, %241, %158, %12
%630 = load i32, i32* %2
ret i32 %630
}

LLVM IR (-O2):
@fpattern_isvalid.specialchars = internal constant [11 x i8] c"`-[]{}?!*\1A\00"
define i32 @fpattern_isvalid(i8* %0) {
%2 = alloca [256 x i8]
%3 = getelementptr inbounds [256 x i8], [256 x i8]* %2, i64 0, i64 0
%4 = icmp eq i8* %0, null
br i1 %4, label %193, label %5
5: ; preds = %1
%6 = load i8, i8* %0
%7 = icmp eq i8 %6, 0
br i1 %7, label %192, label %8
8: ; preds = %5, %182
%9 = phi i8 [ %188, %182 ], [ %6, %5 ]
%10 = phi i32 [ %185, %182 ], [ 0, %5 ]
%11 = sext i8 %9 to i32
switch i32 %11, label %181 [
i32 91, label %12
i32 123, label %12
i32 96, label %157
i32 42, label %182
]
12: ; preds = %8, %8
%13 = icmp eq i8 %9, 91
%14 = xor i1 %13, true
%15 = zext i1 %14 to i32
%16 = select i1 %13, i32 93, i32 125
%17 = add nsw i32 %10, 1
%18 = sext i32 %17 to i64
%19 = getelementptr inbounds i8, i8* %0, i64 %18
%20 = load i8, i8* %19
%21 = icmp eq i8 %20, 33
%22 = add nsw i32 %10, 2
%23 = select i1 %21, i32 %22, i32 %17
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %0, i64 %24
%26 = load i8, i8* %25
br label %27
27: ; preds = %153, %12
%28 = phi i8 [ %26, %12 ], [ %154, %153 ]
%29 = phi i32 [ %23, %12 ], [ %155, %153 ]
%30 = sext i8 %28 to i32
%31 = icmp eq i32 %16, %30
br i1 %31, label %182, label %32
32: ; preds = %27
%33 = icmp eq i8 %28, 96
br i1 %33, label %34, label %75
34: ; preds = %32
%35 = add nsw i32 %29, 1
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %0, i64 %36
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = freeze i8 %38
%41 = add i8 %40, -48
%42 = icmp ult i8 %41, 10
br i1 %42, label %44, label %43
43: ; preds = %34
switch i8 %40, label %72 [
i8 102, label %44
i8 101, label %44
i8 100, label %44
i8 99, label %44
i8 98, label %44
i8 97, label %44
i8 70, label %44
i8 69, label %44
i8 68, label %44
i8 67, label %44
i8 66, label %44
i8 65, label %44
]
44: ; preds = %43, %43, %43, %43, %43, %43, %43, %43, %43, %43, %43, %43, %34
%45 = add nsw i32 %29, 2
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i8, i8* %0, i64 %46
%48 = load i8, i8* %47
%49 = freeze i8 %48
%50 = add i8 %49, -48
%51 = icmp ult i8 %50, 10
br i1 %51, label %53, label %52
52: ; preds = %44
switch i8 %49, label %193 [
i8 102, label %53
i8 101, label %53
i8 100, label %53
i8 99, label %53
i8 98, label %53
i8 97, label %53
i8 70, label %53
i8 69, label %53
i8 68, label %53
i8 67, label %53
i8 66, label %53
i8 65, label %53
]
53: ; preds = %52, %52, %52, %52, %52, %52, %52, %52, %52, %52, %52, %52, %44
br i1 %42, label %60, label %54
54: ; preds = %53
%55 = add nsw i8 %40, -97
%56 = icmp ult i8 %55, 6
%57 = select i1 %56, i8 -97, i8 -65
%58 = add nuw nsw i8 %40, 10
%59 = add nsw i8 %58, %57
br label %60
60: ; preds = %53, %54
%61 = phi i8 [ %59, %54 ], [ %41, %53 ]
%62 = shl i8 %61, 4
br i1 %51, label %69, label %63
63: ; preds = %60
%64 = add nsw i8 %49, -97
%65 = icmp ult i8 %64, 6
%66 = select i1 %65, i8 -97, i8 -65
%67 = add nuw nsw i8 %49, 10
%68 = add nsw i8 %67, %66
br label %69
69: ; preds = %63, %60
%70 = phi i8 [ %68, %63 ], [ %50, %60 ]
%71 = or i8 %70, %62
br label %79
72: ; preds = %43
%73 = tail call i8* @memchr(i8* dereferenceable(11) getelementptr inbounds ([11 x i8], [11 x i8]* @fpattern_isvalid.specialchars, i64 0, i64 0), i32 %39, i64 11)
%74 = icmp eq i8* %73, null
br i1 %74, label %193, label %75
75: ; preds = %72, %32
%76 = phi i8 [ %40, %72 ], [ %28, %32 ]
%77 = phi i32 [ %35, %72 ], [ %29, %32 ]
%78 = icmp eq i8 %76, 0
br i1 %78, label %193, label %79
79: ; preds = %69, %75
%80 = phi i8 [ %71, %69 ], [ %76, %75 ]
%81 = phi i32 [ %45, %69 ], [ %77, %75 ]
%82 = sdiv i8 %80, 8
%83 = sext i8 %82 to i64
%84 = getelementptr inbounds [256 x i8], [256 x i8]* %2, i64 0, i64 %83
%85 = load i8, i8* %84
%86 = zext i8 %85 to i32
%87 = and i8 %80, 7
%88 = zext i8 %87 to i32
%89 = shl nuw nsw i32 1, %88
%90 = and i32 %89, %86
%91 = icmp eq i32 %90, 0
br i1 %91, label %92, label %193
92: ; preds = %79
%93 = trunc i32 %89 to i8
%94 = or i8 %85, %93
store i8 %94, i8* %84
%95 = add nsw i32 %81, 1
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds i8, i8* %0, i64 %96
%98 = load i8, i8* %97
%99 = icmp eq i8 %98, 45
br i1 %99, label %100, label %153
100: ; preds = %92
%101 = add nsw i32 %81, 2
%102 = sext i32 %101 to i64
%103 = getelementptr inbounds i8, i8* %0, i64 %102
%104 = load i8, i8* %103
%105 = icmp ne i8 %104, 45
%106 = icmp eq i8 %80, 45
%107 = select i1 %105, i1 true, i1 %106
br i1 %107, label %108, label %153
108: ; preds = %100
%109 = icmp eq i8 %104, 96
br i1 %109, label %110, label %132
110: ; preds = %108
%111 = add nsw i32 %81, 3
%112 = sext i32 %111 to i64
%113 = getelementptr inbounds i8, i8* %0, i64 %112
%114 = load i8, i8* %113
%115 = freeze i8 %114
%116 = add i8 %115, -48
%117 = icmp ult i8 %116, 10
br i1 %117, label %119, label %118
118: ; preds = %110
switch i8 %115, label %128 [
i8 102, label %119
i8 101, label %119
i8 100, label %119
i8 99, label %119
i8 98, label %119
i8 97, label %119
i8 70, label %119
i8 69, label %119
i8 68, label %119
i8 67, label %119
i8 66, label %119
i8 65, label %119
]
119: ; preds = %118, %118, %118, %118, %118, %118, %118, %118, %118, %118, %118, %118, %110
%120 = add nsw i32 %81, 4
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %0, i64 %121
%123 = load i8, i8* %122
%124 = freeze i8 %123
%125 = add i8 %124, -48
%126 = icmp ult i8 %125, 10
br i1 %126, label %132, label %127
127: ; preds = %119
switch i8 %124, label %193 [
i8 102, label %132
i8 101, label %132
i8 100, label %132
i8 99, label %132
i8 98, label %132
i8 97, label %132
i8 70, label %132
i8 69, label %132
i8 68, label %132
i8 67, label %132
i8 66, label %132
i8 65, label %132
]
128: ; preds = %118
%129 = sext i8 %115 to i32
%130 = tail call i8* @memchr(i8* dereferenceable(11) getelementptr inbounds ([11 x i8], [11 x i8]* @fpattern_isvalid.specialchars, i64 0, i64 0), i32 %129, i64 11)
%131 = icmp eq i8* %130, null
br i1 %131, label %193, label %132
132: ; preds = %127, %127, %127, %127, %127, %127, %127, %127, %127, %127, %127, %127, %119, %128, %108
%133 = phi i8 [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %127 ], [ %124, %119 ], [ %115, %128 ], [ %104, %108 ]
%134 = phi i32 [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %127 ], [ %120, %119 ], [ %111, %128 ], [ %101, %108 ]
%135 = icmp eq i8 %133, 0
%136 = icmp slt i32 %134, 2
%137 = select i1 %135, i1 true, i1 %136
br i1 %137, label %193, label %138
138: ; preds = %132
%139 = add nsw i32 %134, -2
%140 = zext i32 %139 to i64
%141 = getelementptr inbounds i8, i8* %0, i64 %140
%142 = load i8, i8* %141
%143 = icmp ugt i8 %142, %133
br i1 %143, label %193, label %144
144: ; preds = %138
%145 = icmp ne i8 %142, %133
%146 = icmp eq i8 %133, 45
%147 = or i1 %146, %145
br i1 %147, label %148, label %193
148: ; preds = %144
%149 = add nuw nsw i32 %134, 1
%150 = zext i32 %149 to i64
%151 = getelementptr inbounds i8, i8* %0, i64 %150
%152 = load i8, i8* %151
br label %153
153: ; preds = %100, %148, %92
%154 = phi i8 [ 45, %100 ], [ %152, %148 ], [ %98, %92 ]
%155 = phi i32 [ %95, %100 ], [ %149, %148 ], [ %95, %92 ]
%156 = icmp eq i8 %154, 0
br i1 %156, label %193, label %27
157: ; preds = %8
%158 = add nsw i32 %10, 1
%159 = sext i32 %158 to i64
%160 = getelementptr inbounds i8, i8* %0, i64 %159
%161 = load i8, i8* %160
%162 = freeze i8 %161
%163 = add i8 %162, -48
%164 = icmp ult i8 %163, 10
br i1 %164, label %166, label %165
165: ; preds = %157
switch i8 %162, label %175 [
i8 102, label %166
i8 101, label %166
i8 100, label %166
i8 99, label %166
i8 98, label %166
i8 97, label %166
i8 70, label %166
i8 69, label %166
i8 68, label %166
i8 67, label %166
i8 66, label %166
i8 65, label %166
]
166: ; preds = %165, %165, %165, %165, %165, %165, %165, %165, %165, %165, %165, %165, %157
%167 = add nsw i32 %10, 2
%168 = sext i32 %167 to i64
%169 = getelementptr inbounds i8, i8* %0, i64 %168
%170 = load i8, i8* %169
%171 = freeze i8 %170
%172 = add i8 %171, -48
%173 = icmp ult i8 %172, 10
br i1 %173, label %182, label %174
174: ; preds = %166
switch i8 %171, label %193 [
i8 102, label %182
i8 101, label %182
i8 100, label %182
i8 99, label %182
i8 98, label %182
i8 97, label %182
i8 70, label %182
i8 69, label %182
i8 68, label %182
i8 67, label %182
i8 66, label %182
i8 65, label %182
]
175: ; preds = %165
%176 = sext i8 %162 to i32
%177 = tail call i8* @memchr(i8* dereferenceable(11) getelementptr inbounds ([11 x i8], [11 x i8]* @fpattern_isvalid.specialchars, i64 0, i64 0), i32 %176, i64 11)
%178 = icmp eq i8* %177, null
%179 = icmp eq i8 %162, 0
%180 = or i1 %178, %179
br i1 %180, label %193, label %182
181: ; preds = %8
br label %182
182: ; preds = %27, %175, %166, %174, %174, %174, %174, %174, %174, %174, %174, %174, %174, %174, %174, %8, %181
%183 = phi i32 [ %10, %181 ], [ %10, %8 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %174 ], [ %167, %166 ], [ %158, %175 ], [ %29, %27 ]
%184 = phi i32 [ 0, %181 ], [ 1, %8 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %174 ], [ 0, %166 ], [ 0, %175 ], [ %15, %27 ]
%185 = add nsw i32 %183, 1
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds i8, i8* %0, i64 %186
%188 = load i8, i8* %187
%189 = icmp eq i8 %188, 0
br i1 %189, label %190, label %8
190: ; preds = %182
%191 = icmp eq i32 %184, 0
br i1 %191, label %192, label %193
192: ; preds = %5, %190
br label %193
193: ; preds = %174, %175, %127, %52, %153, %138, %144, %132, %128, %79, %75, %72, %192, %190, %1
%194 = phi i32 [ 0, %1 ], [ 1, %192 ], [ 2, %190 ], [ 0, %72 ], [ 0, %75 ], [ 0, %79 ], [ 0, %128 ], [ 0, %132 ], [ 0, %144 ], [ 0, %138 ], [ 0, %153 ], [ 0, %52 ], [ 0, %127 ], [ 0, %175 ], [ 0, %174 ]
ret i32 %194
}