#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ rangematch(char const *, char const, int, char **);
char *strchr(char const *, char);
int /*<<< orphan*/ tolower(unsigned char);
int p_fnmatchx(const char *pattern, const char *string, int flags,
               size_t recurs) {
  const char *stringstart;
  char *newp;
  char c, test;
  int recurs_flags = flags & ~0x04;
  if (recurs-- == 0)
    return 3;
  for (stringstart = string;;)
    switch (c = *pattern++) {
    case '\0':
      if ((flags & 0x08) && *string == '/')
        return (0);
      return (*string == '\0' ? 0 : 1);
    case '?':
      if (*string == '\0')
        return (1);
      if (*string == '/' && (flags & 0x02))
        return (1);
      if (*string == '.' && (flags & 0x04) &&
          (string == stringstart || ((flags & 0x02) && *(string - 1) == '/')))
        return (1);
      ++string;
      break;
    case '*':
      c = *pattern;
      if (c == '*') {
        flags &= ~0x02;
        while (c == '*')
          c = *++pattern;
      }
      if (*string == '.' && (flags & 0x04) &&
          (string == stringstart || ((flags & 0x02) && *(string - 1) == '/')))
        return (1);
      if (c == '\0') {
        if (flags & 0x02)
          return ((flags & 0x08) || strchr(string, '/') == NULL ? 0 : 1);
        else
          return (0);
      } else if (c == '/' && (flags & 0x02)) {
        if ((string = strchr(string, '/')) == NULL)
          return (1);
        break;
      }
      while ((test = *string) != '\0') {
        int e;
        e = p_fnmatchx(pattern, string, recurs_flags, recurs);
        if (e != 1)
          return e;
        if (test == '/' && (flags & 0x02))
          break;
        ++string;
      }
      return (1);
    case '[':
      if (*string == '\0')
        return (1);
      if (*string == '/' && (flags & 0x02))
        return (1);
      if (*string == '.' && (flags & 0x04) &&
          (string == stringstart || ((flags & 0x02) && *(string - 1) == '/')))
        return (1);
      switch (rangematch(pattern, *string, flags, &newp)) {
      case (-1):
        goto normal;
      case 1:
        pattern = newp;
        break;
      case 0:
        return (1);
      }
      ++string;
      break;
    case '\\':
      if (!(flags & 0x01)) {
        if ((c = *pattern++) == '\0') {
          c = '\\';
          --pattern;
        }
      }
    default:
    normal:
      if (c != *string &&
          !((flags & 0x10) &&
            (tolower((unsigned char)c) == tolower((unsigned char)*string))))
        return (1);
      ++string;
      break;
    }
}


x86 assembly (clang, -O0):
<p_fnmatchx>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
and    $0xfffffffb,%eax
mov    %eax,-0x40(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x28(%rbp)
cmp    $0x0,%rax
jne    1185 <p_fnmatchx+0x45>
movl   $0x3,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x48(%rbp)
mov    %al,%cl
mov    %cl,-0x39(%rbp)
test   %eax,%eax
je     11f8 <p_fnmatchx+0xb8>
jmp    11b4 <p_fnmatchx+0x74>
mov    -0x48(%rbp),%eax
sub    $0x2a,%eax
je     12f0 <p_fnmatchx+0x1b0>
jmp    11c5 <p_fnmatchx+0x85>
mov    -0x48(%rbp),%eax
sub    $0x3f,%eax
je     123f <p_fnmatchx+0xff>
jmp    11d6 <p_fnmatchx+0x96>
mov    -0x48(%rbp),%eax
sub    $0x5b,%eax
je     14d2 <p_fnmatchx+0x392>
jmp    11e7 <p_fnmatchx+0xa7>
mov    -0x48(%rbp),%eax
sub    $0x5c,%eax
je     15ec <p_fnmatchx+0x4ac>
jmp    1635 <p_fnmatchx+0x4f5>
mov    -0x1c(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     1223 <p_fnmatchx+0xe3>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    1223 <p_fnmatchx+0xe3>
movl   $0x0,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%edx
mov    $0x1,%eax
xor    %ecx,%ecx
cmp    $0x0,%edx
cmove  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    125b <p_fnmatchx+0x11b>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    1286 <p_fnmatchx+0x146>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1286 <p_fnmatchx+0x146>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    12df <p_fnmatchx+0x19f>
mov    -0x1c(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     12df <p_fnmatchx+0x19f>
mov    -0x18(%rbp),%rax
cmp    -0x30(%rbp),%rax
je     12d3 <p_fnmatchx+0x193>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     12df <p_fnmatchx+0x19f>
mov    -0x18(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    12df <p_fnmatchx+0x19f>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1699 <p_fnmatchx+0x559>
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x39(%rbp)
movsbl -0x39(%rbp),%eax
cmp    $0x2a,%eax
jne    133b <p_fnmatchx+0x1fb>
mov    -0x1c(%rbp),%eax
and    $0xfffffffd,%eax
mov    %eax,-0x1c(%rbp)
movsbl -0x39(%rbp),%eax
cmp    $0x2a,%eax
jne    1336 <p_fnmatchx+0x1f6>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x39(%rbp)
jmp    130f <p_fnmatchx+0x1cf>
jmp    133b <p_fnmatchx+0x1fb>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1394 <p_fnmatchx+0x254>
mov    -0x1c(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     1394 <p_fnmatchx+0x254>
mov    -0x18(%rbp),%rax
cmp    -0x30(%rbp),%rax
je     1388 <p_fnmatchx+0x248>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1394 <p_fnmatchx+0x254>
mov    -0x18(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    1394 <p_fnmatchx+0x254>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
movsbl -0x39(%rbp),%eax
cmp    $0x0,%eax
jne    1400 <p_fnmatchx+0x2c0>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     13f4 <p_fnmatchx+0x2b4>
mov    -0x1c(%rbp),%ecx
and    $0x8,%ecx
mov    $0x1,%al
cmp    $0x0,%ecx
mov    %al,-0x49(%rbp)
jne    13dc <p_fnmatchx+0x29c>
mov    -0x18(%rbp),%rdi
mov    $0x2f,%esi
call   1030 <strchr@plt>
cmp    $0x0,%rax
sete   %al
mov    %al,-0x49(%rbp)
mov    -0x49(%rbp),%dl
mov    $0x1,%eax
xor    %ecx,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
movl   $0x0,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
movsbl -0x39(%rbp),%eax
cmp    $0x2f,%eax
jne    1449 <p_fnmatchx+0x309>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1449 <p_fnmatchx+0x309>
mov    -0x18(%rbp),%rdi
mov    $0x2f,%esi
call   1030 <strchr@plt>
mov    %rax,-0x18(%rbp)
cmp    $0x0,%rax
jne    1444 <p_fnmatchx+0x304>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
jmp    1699 <p_fnmatchx+0x559>
jmp    144e <p_fnmatchx+0x30e>
jmp    1453 <p_fnmatchx+0x313>
mov    -0x18(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x3a(%rbp)
movsbl %al,%eax
cmp    $0x0,%eax
je     14c6 <p_fnmatchx+0x386>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x40(%rbp),%edx
mov    -0x28(%rbp),%rcx
call   1060 <p_fnmatchx@plt>
mov    %eax,-0x44(%rbp)
cmpl   $0x1,-0x44(%rbp)
je     1494 <p_fnmatchx+0x354>
mov    -0x44(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
movsbl -0x3a(%rbp),%eax
cmp    $0x2f,%eax
jne    14b5 <p_fnmatchx+0x375>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     14b5 <p_fnmatchx+0x375>
jmp    14c6 <p_fnmatchx+0x386>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1453 <p_fnmatchx+0x313>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    14ee <p_fnmatchx+0x3ae>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    1519 <p_fnmatchx+0x3d9>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1519 <p_fnmatchx+0x3d9>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1572 <p_fnmatchx+0x432>
mov    -0x1c(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     1572 <p_fnmatchx+0x432>
mov    -0x18(%rbp),%rax
cmp    -0x30(%rbp),%rax
je     1566 <p_fnmatchx+0x426>
mov    -0x1c(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1572 <p_fnmatchx+0x432>
mov    -0x18(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    1572 <p_fnmatchx+0x432>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rax
movsbl (%rax),%esi
mov    -0x1c(%rbp),%edx
lea    -0x38(%rbp),%rcx
call   1050 <rangematch@plt>
mov    %eax,%ecx
mov    %ecx,-0x50(%rbp)
sub    $0xffffffff,%eax
je     15bd <p_fnmatchx+0x47d>
jmp    159c <p_fnmatchx+0x45c>
mov    -0x50(%rbp),%eax
test   %eax,%eax
je     15cf <p_fnmatchx+0x48f>
jmp    15ac <p_fnmatchx+0x46c>
mov    -0x50(%rbp),%eax
sub    $0x1,%eax
je     15c2 <p_fnmatchx+0x482>
jmp    15db <p_fnmatchx+0x49b>
jmp    163a <p_fnmatchx+0x4fa>
mov    -0x38(%rbp),%rax
mov    %rax,-0x10(%rbp)
jmp    15db <p_fnmatchx+0x49b>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1699 <p_fnmatchx+0x559>
mov    -0x1c(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
jne    1630 <p_fnmatchx+0x4f0>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x39(%rbp)
movsbl %al,%eax
cmp    $0x0,%eax
jne    162b <p_fnmatchx+0x4eb>
movb   $0x5c,-0x39(%rbp)
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    1630 <p_fnmatchx+0x4f0>
jmp    1635 <p_fnmatchx+0x4f5>
jmp    163a <p_fnmatchx+0x4fa>
movsbl -0x39(%rbp),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
je     168d <p_fnmatchx+0x54d>
mov    -0x1c(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1681 <p_fnmatchx+0x541>
movzbl -0x39(%rbp),%edi
call   1040 <tolower@plt>
mov    %eax,-0x54(%rbp)
mov    -0x18(%rbp),%rax
movzbl (%rax),%edi
call   1040 <tolower@plt>
mov    %eax,%ecx
mov    -0x54(%rbp),%eax
cmp    %ecx,%eax
je     168d <p_fnmatchx+0x54d>
movl   $0x1,-0x4(%rbp)
jmp    169e <p_fnmatchx+0x55e>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    118d <p_fnmatchx+0x4d>
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<p_fnmatchx>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rsi,0x8(%rsp)
mov    $0x3,%r12d
sub    $0x1,%rcx
mov    %rcx,0x18(%rsp)
jae    1176 <p_fnmatchx+0x36>
mov    %r12d,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %edx,%r13d
mov    %rdi,%rbx
mov    %edx,%eax
and    $0xfffffffb,%eax
mov    %eax,0x14(%rsp)
mov    0x8(%rsp),%r15
jmp    11a4 <p_fnmatchx+0x64>
test   $0x2,%r13b
jne    1164 <p_fnmatchx+0x24>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%r15
mov    %rbx,%rax
add    $0x1,%rbx
mov    (%rax),%bpl
movsbl %bpl,%ecx
cmp    $0x5a,%ecx
jle    11f0 <p_fnmatchx+0xb0>
cmp    $0x5b,%ecx
je     1240 <p_fnmatchx+0x100>
cmp    $0x5c,%ecx
jne    1360 <p_fnmatchx+0x220>
test   $0x1,%r13b
jne    1360 <p_fnmatchx+0x220>
movzbl 0x1(%rax),%ebp
add    $0x2,%rax
test   %bpl,%bpl
mov    $0x5c,%ecx
cmove  %ecx,%ebp
cmovne %rax,%rbx
jmp    1360 <p_fnmatchx+0x220>
nop
cmp    $0x3f,%ecx
jne    1292 <p_fnmatchx+0x152>
mov    (%r15),%al
mov    $0x1,%r12d
cmp    $0x2f,%al
je     118c <p_fnmatchx+0x4c>
test   %al,%al
je     1164 <p_fnmatchx+0x24>
cmp    $0x2e,%al
jne    11a0 <p_fnmatchx+0x60>
mov    %r13d,%eax
and    $0x4,%eax
je     11a0 <p_fnmatchx+0x60>
cmp    0x8(%rsp),%r15
je     1164 <p_fnmatchx+0x24>
test   $0x2,%r13b
je     11a0 <p_fnmatchx+0x60>
cmpb   $0x2f,-0x1(%r15)
jne    11a0 <p_fnmatchx+0x60>
jmp    1164 <p_fnmatchx+0x24>
nop
mov    (%r15),%al
mov    $0x1,%r12d
cmp    $0x2f,%al
je     1329 <p_fnmatchx+0x1e9>
test   %al,%al
je     1164 <p_fnmatchx+0x24>
cmp    $0x2e,%al
jne    1333 <p_fnmatchx+0x1f3>
mov    %r13d,%ecx
and    $0x4,%ecx
je     1333 <p_fnmatchx+0x1f3>
cmp    0x8(%rsp),%r15
je     1164 <p_fnmatchx+0x24>
test   $0x2,%r13b
je     1333 <p_fnmatchx+0x1f3>
cmpb   $0x2f,-0x1(%r15)
jne    1333 <p_fnmatchx+0x1f3>
jmp    1164 <p_fnmatchx+0x24>
test   %ecx,%ecx
je     13a6 <p_fnmatchx+0x266>
cmp    $0x2a,%ecx
jne    1360 <p_fnmatchx+0x220>
mov    (%rbx),%al
cmp    $0x2a,%al
jne    12c0 <p_fnmatchx+0x180>
nopl   0x0(%rax)
movzbl 0x1(%rbx),%eax
add    $0x1,%rbx
cmp    $0x2a,%al
je     12b0 <p_fnmatchx+0x170>
and    $0xfffffffd,%r13d
mov    (%r15),%bpl
cmp    $0x2e,%bpl
jne    12f3 <p_fnmatchx+0x1b3>
mov    %r13d,%ecx
and    $0x4,%ecx
je     12f3 <p_fnmatchx+0x1b3>
mov    $0x1,%r12d
cmp    0x8(%rsp),%r15
je     1164 <p_fnmatchx+0x24>
test   $0x2,%r13b
je     12f3 <p_fnmatchx+0x1b3>
cmpb   $0x2f,-0x1(%r15)
je     1164 <p_fnmatchx+0x24>
cmp    $0x2f,%al
jne    13c8 <p_fnmatchx+0x288>
test   $0x2,%r13b
je     13f9 <p_fnmatchx+0x2b9>
mov    %r15,%rdi
mov    $0x2f,%esi
call   1030 <strchr@plt>
mov    %rax,%r15
mov    $0x1,%r12d
test   %rax,%rax
jne    11a4 <p_fnmatchx+0x64>
jmp    1164 <p_fnmatchx+0x24>
test   $0x2,%r13b
jne    1164 <p_fnmatchx+0x24>
movsbl %al,%esi
mov    %rbx,%rdi
mov    %r13d,%edx
lea    0x20(%rsp),%rcx
call   1050 <rangematch@plt>
cmp    $0xffffffff,%eax
je     1360 <p_fnmatchx+0x220>
cmp    $0x1,%eax
je     139c <p_fnmatchx+0x25c>
test   %eax,%eax
jne    11a0 <p_fnmatchx+0x60>
jmp    1164 <p_fnmatchx+0x24>
nopl   (%rax)
cmp    (%r15),%bpl
je     11a0 <p_fnmatchx+0x60>
mov    $0x1,%r12d
test   $0x10,%r13b
je     1164 <p_fnmatchx+0x24>
movzbl %bpl,%edi
call   1040 <tolower@plt>
mov    %eax,%r14d
movzbl (%r15),%edi
call   1040 <tolower@plt>
cmp    %eax,%r14d
je     11a0 <p_fnmatchx+0x60>
jmp    1164 <p_fnmatchx+0x24>
mov    0x20(%rsp),%rbx
jmp    11a0 <p_fnmatchx+0x60>
mov    (%r15),%al
test   $0x8,%r13b
je     13ba <p_fnmatchx+0x27a>
xor    %r12d,%r12d
cmp    $0x2f,%al
je     1164 <p_fnmatchx+0x24>
xor    %r12d,%r12d
test   %al,%al
setne  %r12b
jmp    1164 <p_fnmatchx+0x24>
test   %al,%al
jne    13fe <p_fnmatchx+0x2be>
and    $0xa,%r13d
xor    %r12d,%r12d
cmp    $0x2,%r13d
jne    1164 <p_fnmatchx+0x24>
mov    %r15,%rdi
mov    $0x2f,%esi
call   1030 <strchr@plt>
xor    %r12d,%r12d
test   %rax,%rax
setne  %r12b
jmp    1164 <p_fnmatchx+0x24>
mov    $0x1,%r14b
jmp    1406 <p_fnmatchx+0x2c6>
test   $0x2,%r13b
sete   %r14b
mov    $0x1,%r12d
test   %bpl,%bpl
mov    0x18(%rsp),%r13
je     1164 <p_fnmatchx+0x24>
mov    %rbx,%rdi
mov    %r15,%rsi
mov    0x14(%rsp),%edx
mov    %r13,%rcx
call   1060 <p_fnmatchx@plt>
cmp    $0x1,%eax
jne    1456 <p_fnmatchx+0x316>
cmp    $0x2f,%bpl
setne  %al
or     %r14b,%al
cmp    $0x1,%al
jne    1164 <p_fnmatchx+0x24>
movzbl 0x1(%r15),%ebp
add    $0x1,%r15
test   %bpl,%bpl
jne    141a <p_fnmatchx+0x2da>
jmp    1164 <p_fnmatchx+0x24>
mov    %eax,%r12d
jmp    1164 <p_fnmatchx+0x24>

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

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