int smatch(pat, str) const char *pat, *str;
{
  const char *start = str;
  static int inword = 0;
  while (*pat) {
    switch (*pat) {
    case '\\':
      pat++;
      if (tolower((unsigned char)(*pat++)) != tolower((unsigned char)(*str++)))
        return 1;
      break;
    case '?':
      if (!*str || (inword && isspace((unsigned char)(*str))))
        return 1;
      str++;
      pat++;
      break;
    case '*':
      while (*pat == '*' || *pat == '?') {
        if (*pat == '?') {
          if (!*str || (inword && isspace((unsigned char)(*str))))
            return 1;
          str++;
        }
        pat++;
      }
      if (inword) {
        while (*str && !isspace((unsigned char)(*str)))
          if (!smatch(pat, str++))
            return 0;
        return smatch(pat, str);
      } else if (!*pat) {
        return 0;
      } else if (*pat == '{') {
        if (str == start || isspace((unsigned char)(str[-1])))
          if (!smatch(pat, str))
            return 0;
        while (*++str)
          if (isspace((unsigned char)(str[-1])) && !smatch(pat, str))
            return 0;
        return 1;
      } else if (*pat == '[') {
        while (*str)
          if (!smatch(pat, str++))
            return 0;
        return 1;
      } else {
        char c = (pat[0] == '\\' && pat[1]) ? pat[1] : pat[0];
        for (c = tolower((unsigned char)(c)); *str; str++)
          if (tolower((unsigned char)(*str)) == c && !smatch(pat, str))
            return 0;
        return 1;
      }
    case '[':
      if (inword && isspace((unsigned char)(*str)))
        return 1;
      if (!(pat = cmatch(pat, *str++)))
        return 1;
      break;
    case '{':
      if (str != start && !isspace((unsigned char)(*(str - 1))))
        return 1;
      {
        const char *end;
        int result = 1;
        if (!(end = estrchr(pat, '}', '\\'))) {
          eprintf("smatch: unmatched '{'");
          return 1;
        }
        inword = 1;
        for (pat++; pat <= end; pat++) {
          if ((result = smatch(pat, str)) == 0)
            break;
          if (!(pat = estrchr(pat, '|', '\\')))
            break;
        }
        inword = 0;
        if (result)
          return result;
        pat = end + 1;
        while (*str && !isspace((unsigned char)(*str)))
          str++;
      }
      break;
    case '}':
    case '|':
      if (inword)
        return (*str && !isspace((unsigned char)(*str)));
    default:
      if (tolower((unsigned char)(*pat++)) != tolower((unsigned char)(*str++)))
        return 1;
      break;
    }
  }
  return tolower((unsigned char)(*pat)) - tolower((unsigned char)(*str));
}


x86 assembly (clang, -O0):
<smatch>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     1853 <smatch+0x6f3>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x38(%rbp)
sub    $0x2a,%eax
je     12a8 <smatch+0x148>
jmp    119d <smatch+0x3d>
mov    -0x38(%rbp),%eax
sub    $0x3f,%eax
je     1250 <smatch+0xf0>
jmp    11ae <smatch+0x4e>
mov    -0x38(%rbp),%eax
sub    $0x5b,%eax
je     15d0 <smatch+0x470>
jmp    11bf <smatch+0x5f>
mov    -0x38(%rbp),%eax
sub    $0x5c,%eax
je     11f5 <smatch+0x95>
jmp    11d0 <smatch+0x70>
mov    -0x38(%rbp),%eax
sub    $0x7b,%eax
je     163c <smatch+0x4dc>
jmp    11e1 <smatch+0x81>
mov    -0x38(%rbp),%eax
add    $0xffffff84,%eax
sub    $0x2,%eax
jb     17b1 <smatch+0x651>
jmp    17ff <smatch+0x69f>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl (%rax),%edi
call   1060 <tolower@plt>
mov    %eax,-0x3c(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movzbl (%rax),%edi
call   1060 <tolower@plt>
mov    %eax,%ecx
mov    -0x3c(%rbp),%eax
cmp    %ecx,%eax
je     124b <smatch+0xeb>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    184e <smatch+0x6ee>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     127f <smatch+0x11f>
cmpl   $0x0,0x2df0(%rip)
je     128b <smatch+0x12b>
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
je     128b <smatch+0x12b>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    184e <smatch+0x6ee>
jmp    12ad <smatch+0x14d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x2a,%ecx
mov    %al,-0x3d(%rbp)
je     12d2 <smatch+0x172>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3f,%eax
sete   %al
mov    %al,-0x3d(%rbp)
mov    -0x3d(%rbp),%al
test   $0x1,%al
jne    12e2 <smatch+0x182>
jmp    134a <smatch+0x1ea>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3f,%eax
jne    1339 <smatch+0x1d9>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1321 <smatch+0x1c1>
cmpl   $0x0,0x2d4e(%rip)
je     132d <smatch+0x1cd>
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
je     132d <smatch+0x1cd>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    12ad <smatch+0x14d>
cmpl   $0x0,0x2d03(%rip)
je     13df <smatch+0x27f>
jmp    135c <smatch+0x1fc>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x3e(%rbp)
je     1388 <smatch+0x228>
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
mov    %al,-0x3e(%rbp)
mov    -0x3e(%rbp),%al
test   $0x1,%al
jne    1398 <smatch+0x238>
jmp    13ca <smatch+0x26a>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    %rsi,%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
call   1040 <smatch@plt>
cmp    $0x0,%eax
jne    13c5 <smatch+0x265>
movl   $0x0,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    135c <smatch+0x1fc>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <smatch@plt>
mov    %eax,-0x4(%rbp)
jmp    1878 <smatch+0x718>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    13f8 <smatch+0x298>
movl   $0x0,-0x4(%rbp)
jmp    1878 <smatch+0x718>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7b,%eax
jne    14ba <smatch+0x35a>
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
je     142c <smatch+0x2cc>
mov    -0x18(%rbp),%rax
movzbl -0x1(%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
je     1453 <smatch+0x2f3>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <smatch@plt>
cmp    $0x0,%eax
jne    144e <smatch+0x2ee>
movl   $0x0,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    1453 <smatch+0x2f3>
jmp    1458 <smatch+0x2f8>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
cmpb   $0x0,0x1(%rax)
je     14ae <smatch+0x34e>
mov    -0x18(%rbp),%rax
movzbl -0x1(%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
je     14a9 <smatch+0x349>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <smatch@plt>
cmp    $0x0,%eax
jne    14a9 <smatch+0x349>
movl   $0x0,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    1458 <smatch+0x2f8>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5b,%eax
jne    151a <smatch+0x3ba>
jmp    14cf <smatch+0x36f>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     150e <smatch+0x3ae>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    %rsi,%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
call   1040 <smatch@plt>
cmp    $0x0,%eax
jne    1509 <smatch+0x3a9>
movl   $0x0,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    14cf <smatch+0x36f>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    154b <smatch+0x3eb>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
je     154b <smatch+0x3eb>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
mov    %eax,-0x44(%rbp)
jmp    1555 <smatch+0x3f5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    %al,-0x21(%rbp)
movzbl -0x21(%rbp),%edi
call   1060 <tolower@plt>
mov    %al,-0x21(%rbp)
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     15c4 <smatch+0x464>
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1060 <tolower@plt>
movsbl -0x21(%rbp),%ecx
cmp    %ecx,%eax
jne    15ae <smatch+0x44e>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <smatch@plt>
cmp    $0x0,%eax
jne    15ae <smatch+0x44e>
movl   $0x0,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    15b3 <smatch+0x453>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1567 <smatch+0x407>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
cmpl   $0x0,0x2a7d(%rip)
je     15fe <smatch+0x49e>
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
je     15fe <smatch+0x49e>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%esi
mov    $0x0,%al
call   1070 <cmatch@plt>
cltq
mov    %rax,-0x10(%rbp)
cmp    $0x0,%rax
jne    1637 <smatch+0x4d7>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    184e <smatch+0x6ee>
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
je     166c <smatch+0x50c>
mov    -0x18(%rbp),%rax
movzbl -0x1(%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
jne    166c <smatch+0x50c>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
movl   $0x1,-0x34(%rbp)
mov    -0x10(%rbp),%rdi
mov    $0x7d,%esi
mov    $0x5c,%edx
mov    $0x0,%al
call   1030 <estrchr@plt>
cltq
mov    %rax,-0x30(%rbp)
cmp    $0x0,%rax
jne    16b2 <smatch+0x552>
lea    0x961(%rip),%rdi
mov    $0x0,%al
call   1080 <eprintf@plt>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
movl   $0x1,0x2998(%rip)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x30(%rbp),%rax
ja     1734 <smatch+0x5d4>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <smatch@plt>
mov    %eax,-0x34(%rbp)
cmp    $0x0,%eax
jne    16f4 <smatch+0x594>
jmp    1734 <smatch+0x5d4>
mov    -0x10(%rbp),%rdi
mov    $0x7c,%esi
mov    $0x5c,%edx
mov    $0x0,%al
call   1030 <estrchr@plt>
cltq
mov    %rax,-0x10(%rbp)
cmp    $0x0,%rax
jne    171e <smatch+0x5be>
jmp    1734 <smatch+0x5d4>
jmp    1723 <smatch+0x5c3>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    16c8 <smatch+0x568>
movl   $0x0,0x2916(%rip)
cmpl   $0x0,-0x34(%rbp)
je     1753 <smatch+0x5f3>
mov    -0x34(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1878 <smatch+0x718>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x45(%rbp)
je     178b <smatch+0x62b>
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
mov    %al,-0x45(%rbp)
mov    -0x45(%rbp),%al
test   $0x1,%al
jne    179b <smatch+0x63b>
jmp    17ac <smatch+0x64c>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    175f <smatch+0x5ff>
jmp    184e <smatch+0x6ee>
cmpl   $0x0,0x289c(%rip)
je     17fa <smatch+0x69a>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x46(%rbp)
je     17ea <smatch+0x68a>
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1050 <isspace@plt>
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
mov    %al,-0x46(%rbp)
mov    -0x46(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    17ff <smatch+0x69f>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movzbl (%rax),%edi
call   1060 <tolower@plt>
mov    %eax,-0x4c(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movzbl (%rax),%edi
call   1060 <tolower@plt>
mov    %eax,%ecx
mov    -0x4c(%rbp),%eax
cmp    %ecx,%eax
je     1849 <smatch+0x6e9>
movl   $0x1,-0x4(%rbp)
jmp    1878 <smatch+0x718>
jmp    184e <smatch+0x6ee>
jmp    1178 <smatch+0x18>
mov    -0x10(%rbp),%rax
movzbl (%rax),%edi
call   1060 <tolower@plt>
mov    %eax,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1060 <tolower@plt>
mov    %eax,%ecx
mov    -0x50(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<smatch>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rsi,%r14
mov    (%rdi),%al
test   %al,%al
je     13e6 <smatch+0x286>
mov    %rdi,%rbx
lea    0xe7e(%rip),%r12
mov    %r14,%r15
jmp    11a1 <smatch+0x41>
add    $0x1,%r14
add    $0x1,%rbx
nop
mov    %rbx,%rbp
mov    0x0(%rbp),%al
mov    %rbp,%rbx
test   %al,%al
je     13e6 <smatch+0x286>
movsbl %al,%ecx
lea    -0x5b(%rcx),%edx
cmp    $0x22,%edx
ja     11d0 <smatch+0x70>
movslq (%r12,%rdx,4),%rcx
add    %r12,%rcx
jmp    *%rcx
cmpb   $0x1,0x2e98(%rip)
jne    11e2 <smatch+0x82>
jmp    1407 <smatch+0x2a7>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmp    $0x3f,%ecx
je     12ff <smatch+0x19f>
cmp    $0x2a,%ecx
je     1363 <smatch+0x203>
movzbl %al,%edi
call   1060 <tolower@plt>
mov    %eax,%ebp
movzbl (%r14),%edi
call   1060 <tolower@plt>
cmp    %eax,%ebp
jne    142d <smatch+0x2cd>
add    $0x1,%rbx
add    $0x1,%r14
jmp    1190 <smatch+0x30>
movzbl (%r14),%ebp
cmpb   $0x1,0x2e42(%rip)
jne    1223 <smatch+0xc3>
mov    %ebp,%edi
call   1050 <isspace@plt>
test   %eax,%eax
jne    142d <smatch+0x2cd>
movsbl %bpl,%esi
mov    %rbx,%rdi
xor    %eax,%eax
call   1070 <cmatch@plt>
test   %eax,%eax
je     142d <smatch+0x2cd>
add    $0x1,%r14
movslq %eax,%rbp
jmp    1193 <smatch+0x33>
movzbl 0x1(%rbx),%edi
call   1060 <tolower@plt>
mov    %eax,%ebp
movzbl (%r14),%edi
call   1060 <tolower@plt>
cmp    %eax,%ebp
jne    142d <smatch+0x2cd>
add    $0x2,%rbx
add    $0x1,%r14
jmp    1190 <smatch+0x30>
cmp    %r15,%r14
je     1285 <smatch+0x125>
movzbl -0x1(%r14),%edi
call   1050 <isspace@plt>
test   %eax,%eax
je     142d <smatch+0x2cd>
mov    %rbx,%rdi
mov    $0x7d,%esi
mov    $0x5c,%edx
xor    %eax,%eax
call   1030 <estrchr@plt>
test   %eax,%eax
je     141f <smatch+0x2bf>
movslq %eax,%rbp
movb   $0x1,0x2da9(%rip)
add    $0x1,%rbx
cmp    %rbp,%rbx
ja     1445 <smatch+0x2e5>
nopl   0x0(%rax,%rax,1)
mov    %rbx,%rdi
mov    %r14,%rsi
call   1040 <smatch@plt>
test   %eax,%eax
je     1330 <smatch+0x1d0>
mov    %eax,%r13d
mov    %rbx,%rdi
mov    $0x7c,%esi
mov    $0x5c,%edx
xor    %eax,%eax
call   1030 <estrchr@plt>
test   %eax,%eax
je     13fe <smatch+0x29e>
movslq %eax,%rbx
add    $0x1,%rbx
cmp    %rbp,%rbx
jbe    12c0 <smatch+0x160>
jmp    13fe <smatch+0x29e>
movzbl (%r14),%edi
mov    $0x1,%r13d
test   %edi,%edi
je     1433 <smatch+0x2d3>
cmpb   $0x1,0x2d3c(%rip)
jne    1187 <smatch+0x27>
call   1050 <isspace@plt>
test   %eax,%eax
je     1187 <smatch+0x27>
jmp    1433 <smatch+0x2d3>
movb   $0x0,0x2d1d(%rip)
add    $0x1,%rbp
mov    (%r14),%al
xchg   %ax,%ax
test   %al,%al
je     1193 <smatch+0x33>
movzbl %al,%edi
call   1050 <isspace@plt>
test   %eax,%eax
jne    1193 <smatch+0x33>
movzbl 0x1(%r14),%eax
add    $0x1,%r14
jmp    1340 <smatch+0x1e0>
mov    0x2cea(%rip),%bpl
jmp    1378 <smatch+0x218>
add    $0x1,%r14
movzbl 0x1(%rbx),%eax
add    $0x1,%rbx
cmp    $0x2a,%al
je     1370 <smatch+0x210>
cmp    $0x3f,%al
jne    13a6 <smatch+0x246>
movzbl (%r14),%edi
mov    $0x1,%r13d
test   %edi,%edi
je     1433 <smatch+0x2d3>
test   $0x1,%bpl
je     136c <smatch+0x20c>
call   1050 <isspace@plt>
test   %eax,%eax
je     136c <smatch+0x20c>
jmp    1433 <smatch+0x2d3>
test   $0x1,%bpl
je     1459 <smatch+0x2f9>
movzbl (%r14),%edi
test   %edi,%edi
je     13dc <smatch+0x27c>
call   1050 <isspace@plt>
test   %eax,%eax
jne    13dc <smatch+0x27c>
lea    0x1(%r14),%rbp
mov    %rbx,%rdi
mov    %r14,%rsi
call   1040 <smatch@plt>
xor    %r13d,%r13d
mov    %rbp,%r14
test   %eax,%eax
jne    13b0 <smatch+0x250>
jmp    1433 <smatch+0x2d3>
mov    (%rbx),%al
test   %al,%al
jne    1182 <smatch+0x22>
xor    %edi,%edi
call   1060 <tolower@plt>
mov    %eax,%r13d
movzbl (%r14),%edi
call   1060 <tolower@plt>
sub    %eax,%r13d
jmp    1433 <smatch+0x2d3>
movb   $0x0,0x2c4f(%rip)
jmp    1433 <smatch+0x2d3>
movzbl (%r14),%edi
test   %edi,%edi
je     1454 <smatch+0x2f4>
call   1050 <isspace@plt>
xor    %r13d,%r13d
test   %eax,%eax
sete   %r13b
jmp    1433 <smatch+0x2d3>
lea    0xc66(%rip),%rdi
xor    %eax,%eax
call   1080 <eprintf@plt>
mov    $0x1,%r13d
mov    %r13d,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x1,%r13d
movb   $0x0,0x2c02(%rip)
jmp    1433 <smatch+0x2d3>
xor    %r13d,%r13d
jmp    1433 <smatch+0x2d3>
xor    %r13d,%r13d
cmp    $0x5b,%al
jg     148a <smatch+0x32a>
test   %al,%al
je     1433 <smatch+0x2d3>
cmp    $0x5b,%al
jne    1507 <smatch+0x3a7>
cmpb   $0x0,(%r14)
je     142d <smatch+0x2cd>
lea    0x1(%r14),%rbp
mov    %rbx,%rdi
mov    %r14,%rsi
call   1040 <smatch@plt>
mov    %rbp,%r14
test   %eax,%eax
jne    146c <smatch+0x30c>
jmp    1433 <smatch+0x2d3>
cmp    $0x5c,%al
je     1500 <smatch+0x3a0>
cmp    $0x7b,%al
jne    1507 <smatch+0x3a7>
cmp    %r15,%r14
je     14a8 <smatch+0x348>
movzbl -0x1(%r14),%edi
call   1050 <isspace@plt>
mov    %r14,%r15
test   %eax,%eax
je     14be <smatch+0x35e>
mov    %rbx,%rdi
mov    %r15,%rsi
call   1040 <smatch@plt>
mov    %r15,%r14
test   %eax,%eax
je     1433 <smatch+0x2d3>
cmpb   $0x0,0x1(%r14)
je     142d <smatch+0x2cd>
add    $0x1,%r14
jmp    14de <smatch+0x37e>
cmpb   $0x0,0x1(%r14)
lea    0x1(%r14),%r14
je     142d <smatch+0x2cd>
movzbl -0x1(%r14),%edi
call   1050 <isspace@plt>
test   %eax,%eax
je     14cf <smatch+0x36f>
mov    %rbx,%rdi
mov    %r14,%rsi
call   1040 <smatch@plt>
test   %eax,%eax
jne    14cf <smatch+0x36f>
jmp    1433 <smatch+0x2d3>
mov    0x1(%rbx),%cl
test   %cl,%cl
jne    1509 <smatch+0x3a9>
mov    %eax,%ecx
mov    (%r14),%r15b
test   %r15b,%r15b
je     142d <smatch+0x2cd>
movzbl %cl,%edi
call   1060 <tolower@plt>
movsbl %al,%ebp
jmp    1534 <smatch+0x3d4>
movzbl 0x1(%r14),%r15d
add    $0x1,%r14
test   %r15b,%r15b
je     142d <smatch+0x2cd>
movzbl %r15b,%edi
call   1060 <tolower@plt>
cmp    %ebp,%eax
jne    1522 <smatch+0x3c2>
mov    %rbx,%rdi
mov    %r14,%rsi
call   1040 <smatch@plt>
test   %eax,%eax
jne    1522 <smatch+0x3c2>
jmp    1433 <smatch+0x2d3>

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

LLVM IR (-O2):
@smatch.inword = internal unnamed_addr global i1 false
@.str = [22 x i8] c"smatch: unmatched '{'\00"
define i32 @smatch(i8* %0, i8* %1) {
%3 = load i8, i8* %0
%4 = icmp eq i8 %3, 0
br i1 %4, label %224, label %5
5: ; preds = %2, %70
%6 = phi i8 [ %71, %70 ], [ %3, %2 ]
%7 = phi i8* [ %59, %70 ], [ %1, %2 ]
%8 = phi i8* [ %42, %70 ], [ %0, %2 ]
br label %9
9: ; preds = %5, %219
%10 = phi i8 [ %6, %5 ], [ %222, %219 ]
%11 = phi i8* [ %8, %5 ], [ %221, %219 ]
%12 = phi i8* [ %7, %5 ], [ %220, %219 ]
%13 = sext i8 %10 to i32
switch i32 %13, label %210 [
i32 92, label %16
i32 63, label %27
i32 42, label %14
i32 91, label %140
i32 123, label %154
i32 125, label %200
i32 124, label %200
]
14: ; preds = %9
%15 = load i1, i1* @smatch.inword
br label %39
16: ; preds = %9
%17 = getelementptr inbounds i8, i8* %11, i64 1
%18 = getelementptr inbounds i8, i8* %11, i64 2
%19 = load i8, i8* %17
%20 = zext i8 %19 to i32
%21 = tail call i32 @tolower(i32 %20)
%22 = getelementptr inbounds i8, i8* %12, i64 1
%23 = load i8, i8* %12
%24 = zext i8 %23 to i32
%25 = tail call i32 @tolower(i32 %24)
%26 = icmp eq i32 %21, %25
br i1 %26, label %219, label %231
27: ; preds = %9
%28 = load i8, i8* %12
%29 = icmp eq i8 %28, 0
br i1 %29, label %231, label %30
30: ; preds = %27
%31 = load i1, i1* @smatch.inword
br i1 %31, label %32, label %36
32: ; preds = %30
%33 = zext i8 %28 to i32
%34 = tail call i32 @isspace(i32 %33)
%35 = icmp eq i32 %34, 0
br i1 %35, label %36, label %231
36: ; preds = %32, %30
%37 = getelementptr inbounds i8, i8* %12, i64 1
%38 = getelementptr inbounds i8, i8* %11, i64 1
br label %219
39: ; preds = %14, %53
%40 = phi i8 [ %56, %53 ], [ %10, %14 ]
%41 = phi i8* [ %54, %53 ], [ %12, %14 ]
%42 = phi i8* [ %55, %53 ], [ %11, %14 ]
switch i8 %40, label %57 [
i8 63, label %43
i8 42, label %53
]
43: ; preds = %39
%44 = load i8, i8* %41
%45 = icmp eq i8 %44, 0
br i1 %45, label %231, label %46
46: ; preds = %43
br i1 %15, label %47, label %51
47: ; preds = %46
%48 = zext i8 %44 to i32
%49 = tail call i32 @isspace(i32 %48)
%50 = icmp eq i32 %49, 0
br i1 %50, label %51, label %231
51: ; preds = %47, %46
%52 = getelementptr inbounds i8, i8* %41, i64 1
br label %53
53: ; preds = %39, %51
%54 = phi i8* [ %52, %51 ], [ %41, %39 ]
%55 = getelementptr inbounds i8, i8* %42, i64 1
%56 = load i8, i8* %55
br label %39
57: ; preds = %39
br i1 %15, label %58, label %73
58: ; preds = %57, %66
%59 = phi i8* [ %67, %66 ], [ %41, %57 ]
%60 = load i8, i8* %59
%61 = icmp eq i8 %60, 0
br i1 %61, label %70, label %62
62: ; preds = %58
%63 = zext i8 %60 to i32
%64 = tail call i32 @isspace(i32 %63)
%65 = icmp eq i32 %64, 0
br i1 %65, label %66, label %70
66: ; preds = %62
%67 = getelementptr inbounds i8, i8* %59, i64 1
%68 = tail call i32 @smatch(i8* %42, i8* %59)
%69 = icmp eq i32 %68, 0
br i1 %69, label %231, label %58
70: ; preds = %58, %62
%71 = load i8, i8* %42
%72 = icmp eq i8 %71, 0
br i1 %72, label %224, label %5
73: ; preds = %57
switch i8 %40, label %117 [
i8 0, label %231
i8 123, label %74
i8 91, label %105
i8 92, label %113
]
74: ; preds = %73
%75 = icmp eq i8* %41, %7
br i1 %75, label %82, label %76
76: ; preds = %74
%77 = getelementptr inbounds i8, i8* %41, i64 -1
%78 = load i8, i8* %77
%79 = zext i8 %78 to i32
%80 = tail call i32 @isspace(i32 %79)
%81 = icmp eq i32 %80, 0
br i1 %81, label %86, label %82
82: ; preds = %76, %74
%83 = phi i8* [ %41, %76 ], [ %7, %74 ]
%84 = tail call i32 @smatch(i8* %42, i8* %83)
%85 = icmp eq i32 %84, 0
br i1 %85, label %231, label %86
86: ; preds = %82, %76
%87 = phi i8* [ %83, %82 ], [ %41, %76 ]
%88 = getelementptr inbounds i8, i8* %87, i64 1
%89 = load i8, i8* %88
%90 = icmp eq i8 %89, 0
br i1 %90, label %231, label %91
91: ; preds = %86, %101
%92 = phi i8* [ %102, %101 ], [ %88, %86 ]
%93 = phi i8* [ %92, %101 ], [ %87, %86 ]
%94 = load i8, i8* %93
%95 = zext i8 %94 to i32
%96 = tail call i32 @isspace(i32 %95)
%97 = icmp eq i32 %96, 0
br i1 %97, label %101, label %98
98: ; preds = %91
%99 = tail call i32 @smatch(i8* %42, i8* %92)
%100 = icmp eq i32 %99, 0
br i1 %100, label %231, label %101
101: ; preds = %98, %91
%102 = getelementptr inbounds i8, i8* %92, i64 1
%103 = load i8, i8* %102
%104 = icmp eq i8 %103, 0
br i1 %104, label %231, label %91
105: ; preds = %73, %109
%106 = phi i8* [ %110, %109 ], [ %41, %73 ]
%107 = load i8, i8* %106
%108 = icmp eq i8 %107, 0
br i1 %108, label %231, label %109
109: ; preds = %105
%110 = getelementptr inbounds i8, i8* %106, i64 1
%111 = tail call i32 @smatch(i8* %42, i8* %106)
%112 = icmp eq i32 %111, 0
br i1 %112, label %231, label %105
113: ; preds = %73
%114 = getelementptr inbounds i8, i8* %42, i64 1
%115 = load i8, i8* %114
%116 = icmp eq i8 %115, 0
br i1 %116, label %117, label %118
117: ; preds = %73, %113
br label %118
118: ; preds = %113, %117
%119 = phi i8 [ %40, %117 ], [ %115, %113 ]
%120 = load i8, i8* %41
%121 = icmp eq i8 %120, 0
br i1 %121, label %231, label %122
122: ; preds = %118
%123 = zext i8 %119 to i32
%124 = tail call i32 @tolower(i32 %123)
%125 = shl i32 %124, 24
%126 = ashr exact i32 %125, 24
br label %127
127: ; preds = %122, %136
%128 = phi i8 [ %120, %122 ], [ %138, %136 ]
%129 = phi i8* [ %41, %122 ], [ %137, %136 ]
%130 = zext i8 %128 to i32
%131 = tail call i32 @tolower(i32 %130)
%132 = icmp eq i32 %131, %126
br i1 %132, label %133, label %136
133: ; preds = %127
%134 = tail call i32 @smatch(i8* %42, i8* %129)
%135 = icmp eq i32 %134, 0
br i1 %135, label %231, label %136
136: ; preds = %127, %133
%137 = getelementptr inbounds i8, i8* %129, i64 1
%138 = load i8, i8* %137
%139 = icmp eq i8 %138, 0
br i1 %139, label %231, label %127
140: ; preds = %9
%141 = load i1, i1* @smatch.inword
%142 = load i8, i8* %12
br i1 %141, label %143, label %147
143: ; preds = %140
%144 = zext i8 %142 to i32
%145 = tail call i32 @isspace(i32 %144)
%146 = icmp eq i32 %145, 0
br i1 %146, label %147, label %231
147: ; preds = %140, %143
%148 = getelementptr inbounds i8, i8* %12, i64 1
%149 = sext i8 %142 to i32
%150 = tail call i32 (i8*, i32, ...) bitcast (i32 (...)* @cmatch to i32 (i8*, i32, ...)*)(i8* %11, i32 %149)
%151 = sext i32 %150 to i64
%152 = inttoptr i64 %151 to i8*
%153 = icmp eq i32 %150, 0
br i1 %153, label %231, label %219
154: ; preds = %9
%155 = icmp eq i8* %12, %7
br i1 %155, label %162, label %156
156: ; preds = %154
%157 = getelementptr inbounds i8, i8* %12, i64 -1
%158 = load i8, i8* %157
%159 = zext i8 %158 to i32
%160 = tail call i32 @isspace(i32 %159)
%161 = icmp eq i32 %160, 0
br i1 %161, label %231, label %162
162: ; preds = %156, %154
%163 = tail call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @estrchr to i32 (i8*, i32, i32, ...)*)(i8* %11, i32 125, i32 92)
%164 = sext i32 %163 to i64
%165 = inttoptr i64 %164 to i8*
%166 = icmp eq i32 %163, 0
br i1 %166, label %167, label %169
167: ; preds = %162
%168 = tail call i32 (i8*, ...) bitcast (i32 (...)* @eprintf to i32 (i8*, ...)*)(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str, i64 0, i64 0))
br label %231
169: ; preds = %162
store i1 true, i1* @smatch.inword
%170 = getelementptr inbounds i8, i8* %11, i64 1
%171 = icmp ugt i8* %170, %165
br i1 %171, label %184, label %172
172: ; preds = %169, %176
%173 = phi i8* [ %181, %176 ], [ %170, %169 ]
%174 = tail call i32 @smatch(i8* %173, i8* %12)
%175 = icmp eq i32 %174, 0
br i1 %175, label %186, label %176
176: ; preds = %172
%177 = tail call i32 (i8*, i32, i32, ...) bitcast (i32 (...)* @estrchr to i32 (i8*, i32, i32, ...)*)(i8* %173, i32 124, i32 92)
%178 = icmp eq i32 %177, 0
%179 = sext i32 %177 to i64
%180 = inttoptr i64 %179 to i8*
%181 = getelementptr inbounds i8, i8* %180, i64 1
%182 = icmp ugt i8* %181, %165
%183 = select i1 %178, i1 true, i1 %182
br i1 %183, label %184, label %172
184: ; preds = %169, %176
%185 = phi i32 [ %174, %176 ], [ 1, %169 ]
store i1 false, i1* @smatch.inword
br label %231
186: ; preds = %172
store i1 false, i1* @smatch.inword
%187 = getelementptr inbounds i8, i8* %165, i64 1
%188 = load i8, i8* %12
%189 = icmp eq i8 %188, 0
br i1 %189, label %219, label %190
190: ; preds = %186, %196
%191 = phi i8 [ %198, %196 ], [ %188, %186 ]
%192 = phi i8* [ %197, %196 ], [ %12, %186 ]
%193 = zext i8 %191 to i32
%194 = tail call i32 @isspace(i32 %193)
%195 = icmp eq i32 %194, 0
br i1 %195, label %196, label %219
196: ; preds = %190
%197 = getelementptr inbounds i8, i8* %192, i64 1
%198 = load i8, i8* %197
%199 = icmp eq i8 %198, 0
br i1 %199, label %219, label %190
200: ; preds = %9, %9
%201 = load i1, i1* @smatch.inword
br i1 %201, label %202, label %210
202: ; preds = %200
%203 = load i8, i8* %12
%204 = icmp eq i8 %203, 0
br i1 %204, label %231, label %205
205: ; preds = %202
%206 = zext i8 %203 to i32
%207 = tail call i32 @isspace(i32 %206)
%208 = icmp eq i32 %207, 0
%209 = zext i1 %208 to i32
br label %231
210: ; preds = %200, %9
%211 = getelementptr inbounds i8, i8* %11, i64 1
%212 = zext i8 %10 to i32
%213 = tail call i32 @tolower(i32 %212)
%214 = getelementptr inbounds i8, i8* %12, i64 1
%215 = load i8, i8* %12
%216 = zext i8 %215 to i32
%217 = tail call i32 @tolower(i32 %216)
%218 = icmp eq i32 %213, %217
br i1 %218, label %219, label %231
219: ; preds = %196, %190, %186, %210, %147, %16, %36
%220 = phi i8* [ %214, %210 ], [ %148, %147 ], [ %37, %36 ], [ %22, %16 ], [ %12, %186 ], [ %197, %196 ], [ %192, %190 ]
%221 = phi i8* [ %211, %210 ], [ %152, %147 ], [ %38, %36 ], [ %18, %16 ], [ %187, %186 ], [ %187, %190 ], [ %187, %196 ]
%222 = load i8, i8* %221
%223 = icmp eq i8 %222, 0
br i1 %223, label %224, label %9
224: ; preds = %70, %219, %2
%225 = phi i8* [ %1, %2 ], [ %220, %219 ], [ %59, %70 ]
%226 = tail call i32 @tolower(i32 0)
%227 = load i8, i8* %225
%228 = zext i8 %227 to i32
%229 = tail call i32 @tolower(i32 %228)
%230 = sub nsw i32 %226, %229
br label %231
231: ; preds = %210, %156, %147, %143, %27, %32, %16, %43, %47, %66, %105, %109, %98, %101, %136, %133, %86, %118, %167, %184, %202, %205, %73, %82, %224
%232 = phi i32 [ %230, %224 ], [ 0, %73 ], [ 0, %82 ], [ 0, %202 ], [ %209, %205 ], [ 1, %167 ], [ %185, %184 ], [ 1, %118 ], [ 1, %86 ], [ 1, %136 ], [ 0, %133 ], [ 0, %98 ], [ 1, %101 ], [ 1, %105 ], [ 0, %109 ], [ 0, %66 ], [ 1, %47 ], [ 1, %43 ], [ 1, %16 ], [ 1, %32 ], [ 1, %27 ], [ 1, %143 ], [ 1, %147 ], [ 1, %156 ], [ 1, %210 ]
ret i32 %232
}