int lo_pattern_match(const char *str, const char *p) {
  int negate;
  int match;
  char c;
  while (*p) {
    if (!*str && *p != '*')
      return 0;
    switch (c = *p++) {
    case '*':
      while (*p == '*' && *p != '/')
        p++;
      if (!*p)
        return 1;
      if (*p != '?' && *p != '[' && *p != '{')
        while (*str && *p != *str)
          str++;
      while (*str) {
        if (lo_pattern_match(str, p))
          return 1;
        str++;
      }
      return 0;
    case '?':
      if (*str)
        break;
      return 0;
    case '[':
      if (*p != '!')
        negate = 0;
      else {
        negate = 1;
        p++;
      }
      match = 0;
      while (!match && (c = *p++)) {
        if (!*p)
          return 0;
        if (*p == '-') {
          if (!*++p)
            return 0;
          if (*p != ']') {
            if (*str == c || *str == *p || (*str > c && *str < *p))
              match = 1;
          } else {
            if (*str == '-')
              match = 1;
            break;
          }
        } else {
          if (c == *str)
            match = 1;
          if (*p != ']') {
            if (*p == *str)
              match = 1;
          } else
            break;
        }
      }
      if (negate == match)
        return 0;
      while (*p && *p != ']')
        p++;
      if (!*p++)
        return 0;
      break;
    case '{': {
      const char *place = str;
      const char *remainder = p;
      while (*remainder && *remainder != '}')
        remainder++;
      if (!*remainder++)
        return 0;
      c = *p++;
      while (c) {
        if (c == ',') {
          if (lo_pattern_match(str, remainder)) {
            return 1;
          } else {
            str = place;
          }
        } else if (c == '}') {
          if (!*p && !*str)
            return 1;
          str--;
          break;
        } else if (c == *str) {
          str++;
          if (!*str && *remainder)
            return 0;
        } else {
          str = place;
          while (*p != ',' && *p != '}' && *p)
            p++;
          if (*p == ',')
            p++;
          else if (*p == '}') {
            return 0;
          }
        }
        c = *p++;
      }
    } break;
    case '/':
      if (*p == '/') {
        while (*p && *str) {
          if (lo_pattern_match(str, p))
            return 1;
          else {
            while (*++str && *str != '/')
              ;
            if (!*str)
              return 0;
          }
        }
      }
    default:
      if (c != *str)
        return 0;
      break;
    }
    str++;
  }
  return !*str;
}


x86 assembly (clang, -O0):
<lo_pattern_match>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     18a4 <lo_pattern_match+0x794>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1156 <lo_pattern_match+0x46>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
je     1156 <lo_pattern_match+0x46>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x3c(%rbp)
mov    %al,%cl
mov    %cl,-0x21(%rbp)
sub    $0x2a,%eax
je     11c2 <lo_pattern_match+0xb2>
jmp    117e <lo_pattern_match+0x6e>
mov    -0x3c(%rbp),%eax
sub    $0x2f,%eax
je     178b <lo_pattern_match+0x67b>
jmp    118f <lo_pattern_match+0x7f>
mov    -0x3c(%rbp),%eax
sub    $0x3f,%eax
je     12fd <lo_pattern_match+0x1ed>
jmp    11a0 <lo_pattern_match+0x90>
mov    -0x3c(%rbp),%eax
sub    $0x5b,%eax
je     131b <lo_pattern_match+0x20b>
jmp    11b1 <lo_pattern_match+0xa1>
mov    -0x3c(%rbp),%eax
sub    $0x7b,%eax
je     1554 <lo_pattern_match+0x444>
jmp    186f <lo_pattern_match+0x75f>
jmp    11c7 <lo_pattern_match+0xb7>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2a,%ecx
mov    %al,-0x3d(%rbp)
jne    11ec <lo_pattern_match+0xdc>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
test   $0x1,%al
jne    11fc <lo_pattern_match+0xec>
jmp    120d <lo_pattern_match+0xfd>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    11c7 <lo_pattern_match+0xb7>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1226 <lo_pattern_match+0x116>
movl   $0x1,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3f,%eax
je     12ac <lo_pattern_match+0x19c>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5b,%eax
je     12ac <lo_pattern_match+0x19c>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7b,%eax
je     12ac <lo_pattern_match+0x19c>
jmp    125b <lo_pattern_match+0x14b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x3e(%rbp)
je     1286 <lo_pattern_match+0x176>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x3e(%rbp)
mov    -0x3e(%rbp),%al
test   $0x1,%al
jne    1296 <lo_pattern_match+0x186>
jmp    12a7 <lo_pattern_match+0x197>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    125b <lo_pattern_match+0x14b>
jmp    12ac <lo_pattern_match+0x19c>
jmp    12b1 <lo_pattern_match+0x1a1>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     12f1 <lo_pattern_match+0x1e1>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1030 <lo_pattern_match@plt>
cmp    $0x0,%eax
je     12e0 <lo_pattern_match+0x1d0>
movl   $0x1,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    12b1 <lo_pattern_match+0x1a1>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     130f <lo_pattern_match+0x1ff>
jmp    1893 <lo_pattern_match+0x783>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x21,%eax
je     1337 <lo_pattern_match+0x227>
movl   $0x0,-0x1c(%rbp)
jmp    134a <lo_pattern_match+0x23a>
movl   $0x1,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x20(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x20(%rbp)
mov    %al,-0x3f(%rbp)
jne    1380 <lo_pattern_match+0x270>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x21(%rbp)
movsbl %al,%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x3f(%rbp)
mov    -0x3f(%rbp),%al
test   $0x1,%al
jne    1390 <lo_pattern_match+0x280>
jmp    14c8 <lo_pattern_match+0x3b8>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    13a9 <lo_pattern_match+0x299>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    146d <lo_pattern_match+0x35d>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
cmpb   $0x0,0x1(%rax)
jne    13de <lo_pattern_match+0x2ce>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5d,%eax
je     144c <lo_pattern_match+0x33c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
movsbl -0x21(%rbp),%ecx
cmp    %ecx,%eax
je     1440 <lo_pattern_match+0x330>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     1440 <lo_pattern_match+0x330>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
movsbl -0x21(%rbp),%ecx
cmp    %ecx,%eax
jle    1447 <lo_pattern_match+0x337>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jge    1447 <lo_pattern_match+0x337>
movl   $0x1,-0x20(%rbp)
jmp    1468 <lo_pattern_match+0x358>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1463 <lo_pattern_match+0x353>
movl   $0x1,-0x20(%rbp)
jmp    14c8 <lo_pattern_match+0x3b8>
jmp    14c3 <lo_pattern_match+0x3b3>
movsbl -0x21(%rbp),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    1487 <lo_pattern_match+0x377>
movl   $0x1,-0x20(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5d,%eax
je     14b9 <lo_pattern_match+0x3a9>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    14b4 <lo_pattern_match+0x3a4>
movl   $0x1,-0x20(%rbp)
jmp    14be <lo_pattern_match+0x3ae>
jmp    14c8 <lo_pattern_match+0x3b8>
jmp    14c3 <lo_pattern_match+0x3b3>
jmp    1351 <lo_pattern_match+0x241>
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jne    14e0 <lo_pattern_match+0x3d0>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
jmp    14e5 <lo_pattern_match+0x3d5>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x40(%rbp)
je     150a <lo_pattern_match+0x3fa>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5d,%eax
setne  %al
mov    %al,-0x40(%rbp)
mov    -0x40(%rbp),%al
test   $0x1,%al
jne    151a <lo_pattern_match+0x40a>
jmp    152b <lo_pattern_match+0x41b>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    14e5 <lo_pattern_match+0x3d5>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
cmpb   $0x0,(%rax)
jne    154f <lo_pattern_match+0x43f>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
jmp    1893 <lo_pattern_match+0x783>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x41(%rbp)
je     1589 <lo_pattern_match+0x479>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7d,%eax
setne  %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
test   $0x1,%al
jne    1599 <lo_pattern_match+0x489>
jmp    15aa <lo_pattern_match+0x49a>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    1564 <lo_pattern_match+0x454>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
cmpb   $0x0,(%rax)
jne    15ce <lo_pattern_match+0x4be>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x21(%rbp)
cmpb   $0x0,-0x21(%rbp)
je     1786 <lo_pattern_match+0x676>
movsbl -0x21(%rbp),%eax
cmp    $0x2c,%eax
jne    1628 <lo_pattern_match+0x518>
mov    -0x10(%rbp),%rdi
mov    -0x38(%rbp),%rsi
call   1030 <lo_pattern_match@plt>
cmp    $0x0,%eax
je     161b <lo_pattern_match+0x50b>
movl   $0x1,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x30(%rbp),%rax
mov    %rax,-0x10(%rbp)
jmp    176d <lo_pattern_match+0x65d>
movsbl -0x21(%rbp),%eax
cmp    $0x7d,%eax
jne    166c <lo_pattern_match+0x55c>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    165b <lo_pattern_match+0x54b>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    165b <lo_pattern_match+0x54b>
movl   $0x1,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    1786 <lo_pattern_match+0x676>
movsbl -0x21(%rbp),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    16b9 <lo_pattern_match+0x5a9>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    16b4 <lo_pattern_match+0x5a4>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     16b4 <lo_pattern_match+0x5a4>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
jmp    1763 <lo_pattern_match+0x653>
mov    -0x30(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2c,%ecx
mov    %al,-0x42(%rbp)
je     16fb <lo_pattern_match+0x5eb>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x7d,%ecx
mov    %al,-0x42(%rbp)
je     16fb <lo_pattern_match+0x5eb>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x42(%rbp)
mov    -0x42(%rbp),%al
test   $0x1,%al
jne    170b <lo_pattern_match+0x5fb>
jmp    171c <lo_pattern_match+0x60c>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    16c1 <lo_pattern_match+0x5b1>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2c,%eax
jne    173d <lo_pattern_match+0x62d>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    175e <lo_pattern_match+0x64e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7d,%eax
jne    1759 <lo_pattern_match+0x649>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
jmp    175e <lo_pattern_match+0x64e>
jmp    1763 <lo_pattern_match+0x653>
jmp    1768 <lo_pattern_match+0x658>
jmp    176d <lo_pattern_match+0x65d>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%al
mov    %al,-0x21(%rbp)
jmp    15e2 <lo_pattern_match+0x4d2>
jmp    1893 <lo_pattern_match+0x783>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    186a <lo_pattern_match+0x75a>
jmp    17a0 <lo_pattern_match+0x690>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x43(%rbp)
je     17c5 <lo_pattern_match+0x6b5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0x43(%rbp)
mov    -0x43(%rbp),%al
test   $0x1,%al
jne    17d5 <lo_pattern_match+0x6c5>
jmp    1865 <lo_pattern_match+0x755>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1030 <lo_pattern_match@plt>
cmp    $0x0,%eax
je     17f7 <lo_pattern_match+0x6e7>
movl   $0x1,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
jmp    17fc <lo_pattern_match+0x6ec>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl 0x1(%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x44(%rbp)
je     182d <lo_pattern_match+0x71d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x44(%rbp)
mov    -0x44(%rbp),%al
test   $0x1,%al
jne    183d <lo_pattern_match+0x72d>
jmp    1842 <lo_pattern_match+0x732>
jmp    17fc <lo_pattern_match+0x6ec>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    185b <lo_pattern_match+0x74b>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
jmp    1860 <lo_pattern_match+0x750>
jmp    17a0 <lo_pattern_match+0x690>
jmp    186a <lo_pattern_match+0x75a>
jmp    186f <lo_pattern_match+0x75f>
movsbl -0x21(%rbp),%eax
mov    -0x10(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     188e <lo_pattern_match+0x77e>
movl   $0x0,-0x4(%rbp)
jmp    18b8 <lo_pattern_match+0x7a8>
jmp    1893 <lo_pattern_match+0x783>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1120 <lo_pattern_match+0x10>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<lo_pattern_match>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %rdi,%r14
mov    (%rsi),%cl
test   %cl,%cl
je     1372 <lo_pattern_match+0x262>
mov    %rsi,%rbx
jmp    114e <lo_pattern_match+0x3e>
cmp    $0x2a,%edx
je     138d <lo_pattern_match+0x27d>
cmp    %al,%cl
jne    137d <lo_pattern_match+0x26d>
add    $0x1,%r14
mov    (%r12),%cl
mov    %r12,%rbx
test   %cl,%cl
je     1372 <lo_pattern_match+0x262>
mov    (%r14),%al
xor    %r15d,%r15d
test   %al,%al
jne    1161 <lo_pattern_match+0x51>
cmp    $0x2a,%cl
jne    137d <lo_pattern_match+0x26d>
lea    0x1(%rbx),%r12
movsbl %cl,%edx
cmp    $0x5a,%edx
jg     1180 <lo_pattern_match+0x70>
cmp    $0x2f,%edx
je     11aa <lo_pattern_match+0x9a>
cmp    $0x3f,%edx
jne    112a <lo_pattern_match+0x1a>
test   %al,%al
jne    113b <lo_pattern_match+0x2b>
jmp    137d <lo_pattern_match+0x26d>
cmp    $0x5b,%edx
je     11c0 <lo_pattern_match+0xb0>
cmp    $0x7b,%edx
jne    1133 <lo_pattern_match+0x23>
lea    0x2(%rbx),%rbp
xchg   %ax,%ax
movzbl -0x1(%rbp),%eax
test   %al,%al
je     1277 <lo_pattern_match+0x167>
cmp    $0x7d,%al
je     1277 <lo_pattern_match+0x167>
add    $0x1,%rbp
jmp    1190 <lo_pattern_match+0x80>
cmpb   $0x2f,(%r12)
jne    1133 <lo_pattern_match+0x23>
test   %al,%al
jne    13d2 <lo_pattern_match+0x2c2>
xor    %eax,%eax
jmp    1133 <lo_pattern_match+0x23>
lea    0x2(%rbx),%rdx
xor    %ecx,%ecx
cmpb   $0x21,0x1(%rbx)
sete   %cl
cmove  %rdx,%r12
mov    0x1(%rcx,%rbx,1),%bl
jmp    11ed <lo_pattern_match+0xdd>
nopw   0x0(%rax,%rax,1)
mov    %rbp,%r12
mov    %edx,%ebx
test   %edi,%edi
jne    1309 <lo_pattern_match+0x1f9>
lea    0x1(%r12),%rbp
test   %bl,%bl
je     1302 <lo_pattern_match+0x1f2>
movzbl 0x0(%rbp),%edx
xor    %r15d,%r15d
cmp    $0x2d,%dl
je     1230 <lo_pattern_match+0x120>
test   %dl,%dl
je     137d <lo_pattern_match+0x26d>
xor    %edi,%edi
cmp    %al,%bl
sete   %dil
cmp    $0x5d,%dl
je     132d <lo_pattern_match+0x21d>
cmp    %al,%dl
jne    11e0 <lo_pattern_match+0xd0>
jmp    1334 <lo_pattern_match+0x224>
nopl   0x0(%rax,%rax,1)
movzbl 0x2(%r12),%edx
test   %dl,%dl
je     137d <lo_pattern_match+0x26d>
add    $0x2,%r12
cmp    $0x5d,%dl
je     133e <lo_pattern_match+0x22e>
mov    $0x1,%esi
cmp    %bl,%al
je     1346 <lo_pattern_match+0x236>
cmp    %dl,%al
je     1346 <lo_pattern_match+0x236>
xor    %edi,%edi
cmp    %bl,%al
jle    11e3 <lo_pattern_match+0xd3>
cmp    %dl,%al
jge    11e3 <lo_pattern_match+0xd3>
jmp    1346 <lo_pattern_match+0x236>
test   %al,%al
je     137d <lo_pattern_match+0x26d>
add    $0x2,%rbx
mov    %r14,%rdi
jmp    12ad <lo_pattern_match+0x19d>
nopl   0x0(%rax,%rax,1)
mov    %rbp,%rsi
call   1030 <lo_pattern_match@plt>
mov    %r14,%rcx
test   %eax,%eax
jne    1410 <lo_pattern_match+0x300>
mov    %rbx,%r12
add    $0x1,%rbx
mov    %rcx,%rdi
mov    (%r12),%al
cmp    $0x2c,%al
je     1290 <lo_pattern_match+0x180>
test   %al,%al
je     1322 <lo_pattern_match+0x212>
cmp    $0x7d,%al
je     1310 <lo_pattern_match+0x200>
cmp    (%rdi),%al
jne    12e0 <lo_pattern_match+0x1d0>
lea    0x1(%rdi),%rcx
cmpb   $0x0,0x1(%rdi)
jne    12a3 <lo_pattern_match+0x193>
cmpb   $0x0,0x0(%rbp)
je     12a3 <lo_pattern_match+0x193>
jmp    137d <lo_pattern_match+0x26d>
cs nopw 0x0(%rax,%rax,1)
movzbl (%rbx),%eax
test   %al,%al
je     12fd <lo_pattern_match+0x1ed>
cmp    $0x2c,%al
je     12f9 <lo_pattern_match+0x1e9>
cmp    $0x7d,%al
je     137d <lo_pattern_match+0x26d>
add    $0x1,%rbx
jmp    12e0 <lo_pattern_match+0x1d0>
add    $0x1,%rbx
mov    %r14,%rcx
jmp    12a3 <lo_pattern_match+0x193>
mov    %rbp,%r12
xor    %esi,%esi
jmp    1346 <lo_pattern_match+0x236>
mov    $0x1,%esi
jmp    1346 <lo_pattern_match+0x236>
cmpb   $0x0,(%rbx)
jne    131e <lo_pattern_match+0x20e>
cmpb   $0x0,(%rdi)
je     1410 <lo_pattern_match+0x300>
add    $0xffffffffffffffff,%rdi
mov    %rdi,%r14
mov    %rbx,%r12
jmp    113b <lo_pattern_match+0x2b>
mov    %rbp,%r12
mov    %edi,%esi
jmp    1346 <lo_pattern_match+0x236>
mov    $0x1,%esi
mov    %rbp,%r12
jmp    1346 <lo_pattern_match+0x236>
xor    %esi,%esi
cmp    $0x2d,%al
sete   %sil
cmp    %ecx,%esi
je     1404 <lo_pattern_match+0x2f4>
xchg   %ax,%ax
add    $0x1,%r12
movzbl -0x1(%r12),%eax
test   %al,%al
je     1362 <lo_pattern_match+0x252>
cmp    $0x5d,%al
jne    1350 <lo_pattern_match+0x240>
mov    $0x0,%r15d
test   %al,%al
jne    113b <lo_pattern_match+0x2b>
jmp    137d <lo_pattern_match+0x26d>
xor    %r15d,%r15d
cmpb   $0x0,(%r14)
sete   %r15b
mov    %r15d,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
add    $0x1,%r12
movzbl (%r12),%ecx
cmp    $0x2a,%cl
je     1389 <lo_pattern_match+0x279>
lea    -0x3f(%rcx),%edx
cmp    $0x3c,%dl
ja     140c <lo_pattern_match+0x2fc>
movzbl %dl,%edx
movabs $0x1000000010000001,%rsi
bt     %rdx,%rsi
jae    140c <lo_pattern_match+0x2fc>
test   %al,%al
je     137d <lo_pattern_match+0x26d>
mov    %r14,%rdi
mov    %r12,%rsi
call   1030 <lo_pattern_match@plt>
test   %eax,%eax
jne    1410 <lo_pattern_match+0x300>
cmpb   $0x0,0x1(%r14)
lea    0x1(%r14),%r14
jne    13b6 <lo_pattern_match+0x2a6>
jmp    137d <lo_pattern_match+0x26d>
mov    %r14,%rdi
mov    %r12,%rsi
call   1030 <lo_pattern_match@plt>
mov    $0x1,%r15d
jmp    13f0 <lo_pattern_match+0x2e0>
mov    %r14,%rdi
mov    %r12,%rsi
call   1030 <lo_pattern_match@plt>
test   %eax,%eax
jne    137d <lo_pattern_match+0x26d>
add    $0x1,%r14
movzbl (%r14),%eax
cmp    $0x2f,%al
je     13e5 <lo_pattern_match+0x2d5>
test   %al,%al
jne    13f4 <lo_pattern_match+0x2e4>
xor    %r15d,%r15d
jmp    137d <lo_pattern_match+0x26d>
test   %cl,%cl
jne    1428 <lo_pattern_match+0x318>
mov    $0x1,%r15d
jmp    137d <lo_pattern_match+0x26d>
cmp    %al,%cl
je     13b2 <lo_pattern_match+0x2a2>
movzbl 0x1(%r14),%eax
add    $0x1,%r14
test   %al,%al
jne    141b <lo_pattern_match+0x30b>
jmp    13b2 <lo_pattern_match+0x2a2>

LLVM IR (-O0):
define i32 @lo_pattern_match(i8* %0, i8* %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i8
%9 = alloca i8*
%10 = alloca i8*
store i8* %0, i8** %4
store i8* %1, i8** %5
br label %11
11: ; preds = %425, %2
%12 = load i8*, i8** %5
%13 = load i8, i8* %12
%14 = icmp ne i8 %13, 0
br i1 %14, label %15, label %428
15: ; preds = %11
%16 = load i8*, i8** %4
%17 = load i8, i8* %16
%18 = icmp ne i8 %17, 0
br i1 %18, label %25, label %19
19: ; preds = %15
%20 = load i8*, i8** %5
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
%23 = icmp ne i32 %22, 42
br i1 %23, label %24, label %25
24: ; preds = %19
store i32 0, i32* %3
br label %434
25: ; preds = %19, %15
%26 = load i8*, i8** %5
%27 = getelementptr inbounds i8, i8* %26, i32 1
store i8* %27, i8** %5
%28 = load i8, i8* %26
store i8 %28, i8* %8
%29 = sext i8 %28 to i32
switch i32 %29, label %416 [
i32 42, label %30
i32 63, label %101
i32 91, label %107
i32 123, label %243
i32 47, label %368
]
30: ; preds = %25
br label %31
31: ; preds = %43, %30
%32 = load i8*, i8** %5
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp eq i32 %34, 42
br i1 %35, label %36, label %41
36: ; preds = %31
%37 = load i8*, i8** %5
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp ne i32 %39, 47
br label %41
41: ; preds = %36, %31
%42 = phi i1 [ false, %31 ], [ %40, %36 ]
br i1 %42, label %43, label %46
43: ; preds = %41
%44 = load i8*, i8** %5
%45 = getelementptr inbounds i8, i8* %44, i32 1
store i8* %45, i8** %5
br label %31
46: ; preds = %41
%47 = load i8*, i8** %5
%48 = load i8, i8* %47
%49 = icmp ne i8 %48, 0
br i1 %49, label %51, label %50
50: ; preds = %46
store i32 1, i32* %3
br label %434
51: ; preds = %46
%52 = load i8*, i8** %5
%53 = load i8, i8* %52
%54 = sext i8 %53 to i32
%55 = icmp ne i32 %54, 63
br i1 %55, label %56, label %86
56: ; preds = %51
%57 = load i8*, i8** %5
%58 = load i8, i8* %57
%59 = sext i8 %58 to i32
%60 = icmp ne i32 %59, 91
br i1 %60, label %61, label %86
61: ; preds = %56
%62 = load i8*, i8** %5
%63 = load i8, i8* %62
%64 = sext i8 %63 to i32
%65 = icmp ne i32 %64, 123
br i1 %65, label %66, label %86
66: ; preds = %61
br label %67
67: ; preds = %82, %66
%68 = load i8*, i8** %4
%69 = load i8, i8* %68
%70 = sext i8 %69 to i32
%71 = icmp ne i32 %70, 0
br i1 %71, label %72, label %80
72: ; preds = %67
%73 = load i8*, i8** %5
%74 = load i8, i8* %73
%75 = sext i8 %74 to i32
%76 = load i8*, i8** %4
%77 = load i8, i8* %76
%78 = sext i8 %77 to i32
%79 = icmp ne i32 %75, %78
br label %80
80: ; preds = %72, %67
%81 = phi i1 [ false, %67 ], [ %79, %72 ]
br i1 %81, label %82, label %85
82: ; preds = %80
%83 = load i8*, i8** %4
%84 = getelementptr inbounds i8, i8* %83, i32 1
store i8* %84, i8** %4
br label %67
85: ; preds = %80
br label %86
86: ; preds = %85, %61, %56, %51
br label %87
87: ; preds = %97, %86
%88 = load i8*, i8** %4
%89 = load i8, i8* %88
%90 = icmp ne i8 %89, 0
br i1 %90, label %91, label %100
91: ; preds = %87
%92 = load i8*, i8** %4
%93 = load i8*, i8** %5
%94 = call i32 @lo_pattern_match(i8* %92, i8* %93)
%95 = icmp ne i32 %94, 0
br i1 %95, label %96, label %97
96: ; preds = %91
store i32 1, i32* %3
br label %434
97: ; preds = %91
%98 = load i8*, i8** %4
%99 = getelementptr inbounds i8, i8* %98, i32 1
store i8* %99, i8** %4
br label %87
100: ; preds = %87
store i32 0, i32* %3
br label %434
101: ; preds = %25
%102 = load i8*, i8** %4
%103 = load i8, i8* %102
%104 = icmp ne i8 %103, 0
br i1 %104, label %105, label %106
105: ; preds = %101
br label %425
106: ; preds = %101
store i32 0, i32* %3
br label %434
107: ; preds = %25
%108 = load i8*, i8** %5
%109 = load i8, i8* %108
%110 = sext i8 %109 to i32
%111 = icmp ne i32 %110, 33
br i1 %111, label %112, label %113
112: ; preds = %107
store i32 0, i32* %6
br label %116
113: ; preds = %107
store i32 1, i32* %6
%114 = load i8*, i8** %5
%115 = getelementptr inbounds i8, i8* %114, i32 1
store i8* %115, i8** %5
br label %116
116: ; preds = %113, %112
store i32 0, i32* %7
br label %117
117: ; preds = %214, %116
%118 = load i32, i32* %7
%119 = icmp ne i32 %118, 0
br i1 %119, label %126, label %120
120: ; preds = %117
%121 = load i8*, i8** %5
%122 = getelementptr inbounds i8, i8* %121, i32 1
store i8* %122, i8** %5
%123 = load i8, i8* %121
store i8 %123, i8* %8
%124 = sext i8 %123 to i32
%125 = icmp ne i32 %124, 0
br label %126
126: ; preds = %120, %117
%127 = phi i1 [ false, %117 ], [ %125, %120 ]
br i1 %127, label %128, label %215
128: ; preds = %126
%129 = load i8*, i8** %5
%130 = load i8, i8* %129
%131 = icmp ne i8 %130, 0
br i1 %131, label %133, label %132
132: ; preds = %128
store i32 0, i32* %3
br label %434
133: ; preds = %128
%134 = load i8*, i8** %5
%135 = load i8, i8* %134
%136 = sext i8 %135 to i32
%137 = icmp eq i32 %136, 45
br i1 %137, label %138, label %189
138: ; preds = %133
%139 = load i8*, i8** %5
%140 = getelementptr inbounds i8, i8* %139, i32 1
store i8* %140, i8** %5
%141 = load i8, i8* %140
%142 = icmp ne i8 %141, 0
br i1 %142, label %144, label %143
143: ; preds = %138
store i32 0, i32* %3
br label %434
144: ; preds = %138
%145 = load i8*, i8** %5
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp ne i32 %147, 93
br i1 %148, label %149, label %181
149: ; preds = %144
%150 = load i8*, i8** %4
%151 = load i8, i8* %150
%152 = sext i8 %151 to i32
%153 = load i8, i8* %8
%154 = sext i8 %153 to i32
%155 = icmp eq i32 %152, %154
br i1 %155, label %179, label %156
156: ; preds = %149
%157 = load i8*, i8** %4
%158 = load i8, i8* %157
%159 = sext i8 %158 to i32
%160 = load i8*, i8** %5
%161 = load i8, i8* %160
%162 = sext i8 %161 to i32
%163 = icmp eq i32 %159, %162
br i1 %163, label %179, label %164
164: ; preds = %156
%165 = load i8*, i8** %4
%166 = load i8, i8* %165
%167 = sext i8 %166 to i32
%168 = load i8, i8* %8
%169 = sext i8 %168 to i32
%170 = icmp sgt i32 %167, %169
br i1 %170, label %171, label %180
171: ; preds = %164
%172 = load i8*, i8** %4
%173 = load i8, i8* %172
%174 = sext i8 %173 to i32
%175 = load i8*, i8** %5
%176 = load i8, i8* %175
%177 = sext i8 %176 to i32
%178 = icmp slt i32 %174, %177
br i1 %178, label %179, label %180
179: ; preds = %171, %156, %149
store i32 1, i32* %7
br label %180
180: ; preds = %179, %171, %164
br label %188
181: ; preds = %144
%182 = load i8*, i8** %4
%183 = load i8, i8* %182
%184 = sext i8 %183 to i32
%185 = icmp eq i32 %184, 45
br i1 %185, label %186, label %187
186: ; preds = %181
store i32 1, i32* %7
br label %187
187: ; preds = %186, %181
br label %215
188: ; preds = %180
br label %214
189: ; preds = %133
%190 = load i8, i8* %8
%191 = sext i8 %190 to i32
%192 = load i8*, i8** %4
%193 = load i8, i8* %192
%194 = sext i8 %193 to i32
%195 = icmp eq i32 %191, %194
br i1 %195, label %196, label %197
196: ; preds = %189
store i32 1, i32* %7
br label %197
197: ; preds = %196, %189
%198 = load i8*, i8** %5
%199 = load i8, i8* %198
%200 = sext i8 %199 to i32
%201 = icmp ne i32 %200, 93
br i1 %201, label %202, label %212
202: ; preds = %197
%203 = load i8*, i8** %5
%204 = load i8, i8* %203
%205 = sext i8 %204 to i32
%206 = load i8*, i8** %4
%207 = load i8, i8* %206
%208 = sext i8 %207 to i32
%209 = icmp eq i32 %205, %208
br i1 %209, label %210, label %211
210: ; preds = %202
store i32 1, i32* %7
br label %211
211: ; preds = %210, %202
br label %213
212: ; preds = %197
br label %215
213: ; preds = %211
br label %214
214: ; preds = %213, %188
br label %117
215: ; preds = %212, %187, %126
%216 = load i32, i32* %6
%217 = load i32, i32* %7
%218 = icmp eq i32 %216, %217
br i1 %218, label %219, label %220
219: ; preds = %215
store i32 0, i32* %3
br label %434
220: ; preds = %215
br label %221
221: ; preds = %233, %220
%222 = load i8*, i8** %5
%223 = load i8, i8* %222
%224 = sext i8 %223 to i32
%225 = icmp ne i32 %224, 0
br i1 %225, label %226, label %231
226: ; preds = %221
%227 = load i8*, i8** %5
%228 = load i8, i8* %227
%229 = sext i8 %228 to i32
%230 = icmp ne i32 %229, 93
br label %231
231: ; preds = %226, %221
%232 = phi i1 [ false, %221 ], [ %230, %226 ]
br i1 %232, label %233, label %236
233: ; preds = %231
%234 = load i8*, i8** %5
%235 = getelementptr inbounds i8, i8* %234, i32 1
store i8* %235, i8** %5
br label %221
236: ; preds = %231
%237 = load i8*, i8** %5
%238 = getelementptr inbounds i8, i8* %237, i32 1
store i8* %238, i8** %5
%239 = load i8, i8* %237
%240 = icmp ne i8 %239, 0
br i1 %240, label %242, label %241
241: ; preds = %236
store i32 0, i32* %3
br label %434
242: ; preds = %236
br label %425
243: ; preds = %25
%244 = load i8*, i8** %4
store i8* %244, i8** %9
%245 = load i8*, i8** %5
store i8* %245, i8** %10
br label %246
246: ; preds = %258, %243
%247 = load i8*, i8** %10
%248 = load i8, i8* %247
%249 = sext i8 %248 to i32
%250 = icmp ne i32 %249, 0
br i1 %250, label %251, label %256
251: ; preds = %246
%252 = load i8*, i8** %10
%253 = load i8, i8* %252
%254 = sext i8 %253 to i32
%255 = icmp ne i32 %254, 125
br label %256
256: ; preds = %251, %246
%257 = phi i1 [ false, %246 ], [ %255, %251 ]
br i1 %257, label %258, label %261
258: ; preds = %256
%259 = load i8*, i8** %10
%260 = getelementptr inbounds i8, i8* %259, i32 1
store i8* %260, i8** %10
br label %246
261: ; preds = %256
%262 = load i8*, i8** %10
%263 = getelementptr inbounds i8, i8* %262, i32 1
store i8* %263, i8** %10
%264 = load i8, i8* %262
%265 = icmp ne i8 %264, 0
br i1 %265, label %267, label %266
266: ; preds = %261
store i32 0, i32* %3
br label %434
267: ; preds = %261
%268 = load i8*, i8** %5
%269 = getelementptr inbounds i8, i8* %268, i32 1
store i8* %269, i8** %5
%270 = load i8, i8* %268
store i8 %270, i8* %8
br label %271
271: ; preds = %363, %267
%272 = load i8, i8* %8
%273 = icmp ne i8 %272, 0
br i1 %273, label %274, label %367
274: ; preds = %271
%275 = load i8, i8* %8
%276 = sext i8 %275 to i32
%277 = icmp eq i32 %276, 44
br i1 %277, label %278, label %287
278: ; preds = %274
%279 = load i8*, i8** %4
%280 = load i8*, i8** %10
%281 = call i32 @lo_pattern_match(i8* %279, i8* %280)
%282 = icmp ne i32 %281, 0
br i1 %282, label %283, label %284
283: ; preds = %278
store i32 1, i32* %3
br label %434
284: ; preds = %278
%285 = load i8*, i8** %9
store i8* %285, i8** %4
br label %286
286: ; preds = %284
br label %363
287: ; preds = %274
%288 = load i8, i8* %8
%289 = sext i8 %288 to i32
%290 = icmp eq i32 %289, 125
br i1 %290, label %291, label %303
291: ; preds = %287
%292 = load i8*, i8** %5
%293 = load i8, i8* %292
%294 = icmp ne i8 %293, 0
br i1 %294, label %300, label %295
295: ; preds = %291
%296 = load i8*, i8** %4
%297 = load i8, i8* %296
%298 = icmp ne i8 %297, 0
br i1 %298, label %300, label %299
299: ; preds = %295
store i32 1, i32* %3
br label %434
300: ; preds = %295, %291
%301 = load i8*, i8** %4
%302 = getelementptr inbounds i8, i8* %301, i32 -1
store i8* %302, i8** %4
br label %367
303: ; preds = %287
%304 = load i8, i8* %8
%305 = sext i8 %304 to i32
%306 = load i8*, i8** %4
%307 = load i8, i8* %306
%308 = sext i8 %307 to i32
%309 = icmp eq i32 %305, %308
br i1 %309, label %310, label %323
310: ; preds = %303
%311 = load i8*, i8** %4
%312 = getelementptr inbounds i8, i8* %311, i32 1
store i8* %312, i8** %4
%313 = load i8*, i8** %4
%314 = load i8, i8* %313
%315 = icmp ne i8 %314, 0
br i1 %315, label %322, label %316
316: ; preds = %310
%317 = load i8*, i8** %10
%318 = load i8, i8* %317
%319 = sext i8 %318 to i32
%320 = icmp ne i32 %319, 0
br i1 %320, label %321, label %322
321: ; preds = %316
store i32 0, i32* %3
br label %434
322: ; preds = %316, %310
br label %361
323: ; preds = %303
%324 = load i8*, i8** %9
store i8* %324, i8** %4
br label %325
325: ; preds = %342, %323
%326 = load i8*, i8** %5
%327 = load i8, i8* %326
%328 = sext i8 %327 to i32
%329 = icmp ne i32 %328, 44
br i1 %329, label %330, label %340
330: ; preds = %325
%331 = load i8*, i8** %5
%332 = load i8, i8* %331
%333 = sext i8 %332 to i32
%334 = icmp ne i32 %333, 125
br i1 %334, label %335, label %340
335: ; preds = %330
%336 = load i8*, i8** %5
%337 = load i8, i8* %336
%338 = sext i8 %337 to i32
%339 = icmp ne i32 %338, 0
br label %340
340: ; preds = %335, %330, %325
%341 = phi i1 [ false, %330 ], [ false, %325 ], [ %339, %335 ]
br i1 %341, label %342, label %345
342: ; preds = %340
%343 = load i8*, i8** %5
%344 = getelementptr inbounds i8, i8* %343, i32 1
store i8* %344, i8** %5
br label %325
345: ; preds = %340
%346 = load i8*, i8** %5
%347 = load i8, i8* %346
%348 = sext i8 %347 to i32
%349 = icmp eq i32 %348, 44
br i1 %349, label %350, label %353
350: ; preds = %345
%351 = load i8*, i8** %5
%352 = getelementptr inbounds i8, i8* %351, i32 1
store i8* %352, i8** %5
br label %360
353: ; preds = %345
%354 = load i8*, i8** %5
%355 = load i8, i8* %354
%356 = sext i8 %355 to i32
%357 = icmp eq i32 %356, 125
br i1 %357, label %358, label %359
358: ; preds = %353
store i32 0, i32* %3
br label %434
359: ; preds = %353
br label %360
360: ; preds = %359, %350
br label %361
361: ; preds = %360, %322
br label %362
362: ; preds = %361
br label %363
363: ; preds = %362, %286
%364 = load i8*, i8** %5
%365 = getelementptr inbounds i8, i8* %364, i32 1
store i8* %365, i8** %5
%366 = load i8, i8* %364
store i8 %366, i8* %8
br label %271
367: ; preds = %300, %271
br label %425
368: ; preds = %25
%369 = load i8*, i8** %5
%370 = load i8, i8* %369
%371 = sext i8 %370 to i32
%372 = icmp eq i32 %371, 47
br i1 %372, label %373, label %415
373: ; preds = %368
br label %374
374: ; preds = %413, %373
%375 = load i8*, i8** %5
%376 = load i8, i8* %375
%377 = sext i8 %376 to i32
%378 = icmp ne i32 %377, 0
br i1 %378, label %379, label %384
379: ; preds = %374
%380 = load i8*, i8** %4
%381 = load i8, i8* %380
%382 = sext i8 %381 to i32
%383 = icmp ne i32 %382, 0
br label %384
384: ; preds = %379, %374
%385 = phi i1 [ false, %374 ], [ %383, %379 ]
br i1 %385, label %386, label %414
386: ; preds = %384
%387 = load i8*, i8** %4
%388 = load i8*, i8** %5
%389 = call i32 @lo_pattern_match(i8* %387, i8* %388)
%390 = icmp ne i32 %389, 0
br i1 %390, label %391, label %392
391: ; preds = %386
store i32 1, i32* %3
br label %434
392: ; preds = %386
br label %393
393: ; preds = %406, %392
%394 = load i8*, i8** %4
%395 = getelementptr inbounds i8, i8* %394, i32 1
store i8* %395, i8** %4
%396 = load i8, i8* %395
%397 = sext i8 %396 to i32
%398 = icmp ne i32 %397, 0
br i1 %398, label %399, label %404
399: ; preds = %393
%400 = load i8*, i8** %4
%401 = load i8, i8* %400
%402 = sext i8 %401 to i32
%403 = icmp ne i32 %402, 47
br label %404
404: ; preds = %399, %393
%405 = phi i1 [ false, %393 ], [ %403, %399 ]
br i1 %405, label %406, label %407
406: ; preds = %404
br label %393
407: ; preds = %404
%408 = load i8*, i8** %4
%409 = load i8, i8* %408
%410 = icmp ne i8 %409, 0
br i1 %410, label %412, label %411
411: ; preds = %407
store i32 0, i32* %3
br label %434
412: ; preds = %407
br label %413
413: ; preds = %412
br label %374
414: ; preds = %384
br label %415
415: ; preds = %414, %368
br label %416
416: ; preds = %25, %415
%417 = load i8, i8* %8
%418 = sext i8 %417 to i32
%419 = load i8*, i8** %4
%420 = load i8, i8* %419
%421 = sext i8 %420 to i32
%422 = icmp ne i32 %418, %421
br i1 %422, label %423, label %424
423: ; preds = %416
store i32 0, i32* %3
br label %434
424: ; preds = %416
br label %425
425: ; preds = %424, %367, %242, %105
%426 = load i8*, i8** %4
%427 = getelementptr inbounds i8, i8* %426, i32 1
store i8* %427, i8** %4
br label %11
428: ; preds = %11
%429 = load i8*, i8** %4
%430 = load i8, i8* %429
%431 = icmp ne i8 %430, 0
%432 = xor i1 %431, true
%433 = zext i1 %432 to i32
store i32 %433, i32* %3
br label %434
434: ; preds = %428, %423, %411, %391, %358, %321, %299, %283, %266, %241, %219, %143, %132, %106, %100, %96, %50, %24
%435 = load i32, i32* %3
ret i32 %435
}

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