#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 FNM_NOMATCH;
int FNM_PERIOD;
int /*<<< orphan*/ match_bracket(char const *, int);
int pat_next(char const *, int, size_t *, int);
int str_next(char const *, int, size_t *);
size_t strnlen(char const *, size_t);
int fnmatch_internal(const char *pat, size_t m, const char *str, size_t n,
                     int flags) {
  const char *p, *ptail, *endpat;
  const char *s, *stail, *endstr;
  size_t pinc, sinc, tailcnt = 0;
  int c, k;
  if (flags & FNM_PERIOD) {
    if (*str == '.' && *pat != '.')
      return FNM_NOMATCH;
  }
  for (;;) {
    switch ((c = pat_next(pat, m, &pinc, flags))) {
    case -2:
      return FNM_NOMATCH;
    case -5:
      pat++;
      m--;
      break;
    default:
      k = str_next(str, n, &sinc);
      if (k <= 0)
        return (c == 0) ? 0 : FNM_NOMATCH;
      str += sinc;
      n -= sinc;
      if (c == -3) {
        if (!match_bracket(pat, k))
          return FNM_NOMATCH;
      } else if (c != -4 && k != c) {
        return FNM_NOMATCH;
      }
      pat += pinc;
      m -= pinc;
      continue;
    }
    break;
  }
  m = strnlen(pat, m);
  endpat = pat + m;
  for (p = ptail = pat; p < endpat; p += pinc) {
    switch (pat_next(p, endpat - p, &pinc, flags)) {
    case -2:
      return FNM_NOMATCH;
    case -5:
      tailcnt = 0;
      ptail = p + 1;
      break;
    default:
      tailcnt++;
      break;
    }
  }
  n = strnlen(str, n);
  endstr = str + n;
  if (n < tailcnt)
    return FNM_NOMATCH;
  for (s = endstr; s > str && tailcnt; tailcnt--) {
    if (s[-1] < 128U)
      s--;
    else
      while ((unsigned char)*--s - 0x80U < 0x40 && s > str)
        ;
  }
  if (tailcnt)
    return FNM_NOMATCH;
  stail = s;
  p = ptail;
  for (;;) {
    c = pat_next(p, endpat - p, &pinc, flags);
    p += pinc;
    if ((k = str_next(s, endstr - s, &sinc)) <= 0) {
      if (c != 0)
        return FNM_NOMATCH;
      break;
    }
    s += sinc;
    if (c == -3) {
      if (!match_bracket(p - pinc, k))
        return FNM_NOMATCH;
    } else if (c != -4 && k != c) {
      return FNM_NOMATCH;
    }
  }
  endstr = stail;
  endpat = ptail;
  while (pat < endpat) {
    p = pat;
    s = str;
    for (;;) {
      c = pat_next(p, endpat - p, &pinc, flags);
      p += pinc;
      if (c == -5) {
        pat = p;
        str = s;
        break;
      }
      k = str_next(s, endstr - s, &sinc);
      if (!k)
        return FNM_NOMATCH;
      if (c == -3) {
        if (!match_bracket(p - pinc, k))
          break;
      } else if (c != -4 && k != c) {
        break;
      }
      s += sinc;
    }
    if (c == -5)
      continue;
    k = str_next(str, endstr - str, &sinc);
    if (k > 0)
      str += sinc;
    else
      for (str++; str_next(str, endstr - str, &sinc) < 0; str++)
        ;
  }
  return 0;
}


x86 assembly (clang, -O0):
<fnmatch_internal>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
movq   $0x0,-0x78(%rbp)
mov    -0x2c(%rbp),%eax
mov    0x2e67(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     11b2 <fnmatch_internal+0x72>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    11ad <fnmatch_internal+0x6d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
je     11ad <fnmatch_internal+0x6d>
mov    0x2e45(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
jmp    11b2 <fnmatch_internal+0x72>
jmp    11b7 <fnmatch_internal+0x77>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%esi
mov    -0x2c(%rbp),%ecx
lea    -0x68(%rbp),%rdx
call   1060 <pat_next@plt>
mov    %eax,-0x7c(%rbp)
mov    %eax,%ecx
mov    %ecx,-0x84(%rbp)
sub    $0xfffffffb,%eax
je     1208 <fnmatch_internal+0xc8>
jmp    11e3 <fnmatch_internal+0xa3>
mov    -0x84(%rbp),%eax
sub    $0xfffffffe,%eax
jne    1225 <fnmatch_internal+0xe5>
jmp    11f7 <fnmatch_internal+0xb7>
mov    0x2dea(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    1315 <fnmatch_internal+0x1d5>
mov    -0x20(%rbp),%rdi
mov    -0x28(%rbp),%rax
mov    %eax,%esi
lea    -0x70(%rbp),%rdx
call   1030 <str_next@plt>
mov    %eax,-0x80(%rbp)
cmpl   $0x0,-0x80(%rbp)
jg     1279 <fnmatch_internal+0x139>
cmpl   $0x0,-0x7c(%rbp)
jne    125c <fnmatch_internal+0x11c>
xor    %eax,%eax
mov    %eax,-0x88(%rbp)
jmp    126b <fnmatch_internal+0x12b>
mov    0x2d85(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x88(%rbp)
mov    -0x88(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
mov    -0x70(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x70(%rbp),%rcx
mov    -0x28(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x28(%rbp)
cmpl   $0xfffffffd,-0x7c(%rbp)
jne    12c9 <fnmatch_internal+0x189>
mov    -0x10(%rbp),%rdi
mov    -0x80(%rbp),%esi
call   1050 <match_bracket@plt>
cmp    $0x0,%eax
jne    12c4 <fnmatch_internal+0x184>
mov    0x2d2e(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
jmp    12f5 <fnmatch_internal+0x1b5>
cmpl   $0xfffffffc,-0x7c(%rbp)
je     12f0 <fnmatch_internal+0x1b0>
mov    -0x80(%rbp),%eax
cmp    -0x7c(%rbp),%eax
je     12f0 <fnmatch_internal+0x1b0>
mov    0x2d02(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
jmp    12f5 <fnmatch_internal+0x1b5>
mov    -0x68(%rbp),%rax
add    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x68(%rbp),%rcx
mov    -0x18(%rbp),%rax
sub    %rcx,%rax
mov    %rax,-0x18(%rbp)
jmp    11b7 <fnmatch_internal+0x77>
jmp    131a <fnmatch_internal+0x1da>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
call   1040 <strnlen@plt>
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x48(%rbp),%rax
jae    13de <fnmatch_internal+0x29e>
mov    -0x38(%rbp),%rdi
mov    -0x48(%rbp),%esi
mov    %edi,%eax
sub    %eax,%esi
mov    -0x2c(%rbp),%ecx
lea    -0x68(%rbp),%rdx
call   1060 <pat_next@plt>
mov    %eax,%ecx
mov    %ecx,-0x8c(%rbp)
sub    $0xfffffffb,%eax
je     13a3 <fnmatch_internal+0x263>
jmp    137e <fnmatch_internal+0x23e>
mov    -0x8c(%rbp),%eax
sub    $0xfffffffe,%eax
jne    13bc <fnmatch_internal+0x27c>
jmp    1392 <fnmatch_internal+0x252>
mov    0x2c4f(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
movq   $0x0,-0x78(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    13c8 <fnmatch_internal+0x288>
mov    -0x78(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x78(%rbp)
jmp    13cd <fnmatch_internal+0x28d>
mov    -0x68(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
jmp    1343 <fnmatch_internal+0x203>
mov    -0x20(%rbp),%rdi
mov    -0x28(%rbp),%rsi
call   1040 <strnlen@plt>
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x78(%rbp),%rax
jae    141a <fnmatch_internal+0x2da>
mov    0x2bd8(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
mov    -0x60(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rcx
xor    %eax,%eax
cmp    -0x20(%rbp),%rcx
mov    %al,-0x8d(%rbp)
jbe    1446 <fnmatch_internal+0x306>
cmpq   $0x0,-0x78(%rbp)
setne  %al
mov    %al,-0x8d(%rbp)
mov    -0x8d(%rbp),%al
test   $0x1,%al
jne    1459 <fnmatch_internal+0x319>
jmp    14f0 <fnmatch_internal+0x3b0>
mov    -0x50(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x80,%eax
jae    147d <fnmatch_internal+0x33d>
mov    -0x50(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x50(%rbp)
jmp    14da <fnmatch_internal+0x39a>
jmp    1482 <fnmatch_internal+0x342>
mov    -0x50(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x50(%rbp)
movzbl -0x1(%rax),%ecx
sub    $0x80,%ecx
xor    %eax,%eax
cmp    $0x40,%ecx
mov    %al,-0x8e(%rbp)
jae    14bd <fnmatch_internal+0x37d>
mov    -0x50(%rbp),%rax
cmp    -0x20(%rbp),%rax
seta   %al
mov    %al,-0x8e(%rbp)
mov    -0x8e(%rbp),%al
test   $0x1,%al
jne    14d0 <fnmatch_internal+0x390>
jmp    14d5 <fnmatch_internal+0x395>
jmp    1482 <fnmatch_internal+0x342>
jmp    14da <fnmatch_internal+0x39a>
jmp    14df <fnmatch_internal+0x39f>
mov    -0x78(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x78(%rbp)
jmp    1422 <fnmatch_internal+0x2e2>
cmpq   $0x0,-0x78(%rbp)
je     150c <fnmatch_internal+0x3cc>
mov    0x2ae6(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
mov    -0x50(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rdi
mov    -0x48(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
mov    -0x2c(%rbp),%ecx
lea    -0x68(%rbp),%rdx
call   1060 <pat_next@plt>
mov    %eax,-0x7c(%rbp)
mov    -0x68(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x50(%rbp),%rdi
mov    -0x60(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
lea    -0x70(%rbp),%rdx
call   1030 <str_next@plt>
mov    %eax,-0x80(%rbp)
cmp    $0x0,%eax
jg     158e <fnmatch_internal+0x44e>
cmpl   $0x0,-0x7c(%rbp)
je     1589 <fnmatch_internal+0x449>
mov    0x2a69(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
jmp    1609 <fnmatch_internal+0x4c9>
mov    -0x70(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
cmpl   $0xfffffffd,-0x7c(%rbp)
jne    15d8 <fnmatch_internal+0x498>
mov    -0x38(%rbp),%rdi
xor    %eax,%eax
sub    -0x68(%rbp),%rax
add    %rax,%rdi
mov    -0x80(%rbp),%esi
call   1050 <match_bracket@plt>
cmp    $0x0,%eax
jne    15d3 <fnmatch_internal+0x493>
mov    0x2a1f(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
jmp    1604 <fnmatch_internal+0x4c4>
cmpl   $0xfffffffc,-0x7c(%rbp)
je     15ff <fnmatch_internal+0x4bf>
mov    -0x80(%rbp),%eax
cmp    -0x7c(%rbp),%eax
je     15ff <fnmatch_internal+0x4bf>
mov    0x29f3(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
jmp    1604 <fnmatch_internal+0x4c4>
jmp    151c <fnmatch_internal+0x3dc>
mov    -0x58(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x48(%rbp),%rax
jae    17b3 <fnmatch_internal+0x673>
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x38(%rbp),%rdi
mov    -0x48(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
mov    -0x2c(%rbp),%ecx
lea    -0x68(%rbp),%rdx
call   1060 <pat_next@plt>
mov    %eax,-0x7c(%rbp)
mov    -0x68(%rbp),%rax
add    -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
cmpl   $0xfffffffb,-0x7c(%rbp)
jne    1682 <fnmatch_internal+0x542>
mov    -0x38(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    171d <fnmatch_internal+0x5dd>
mov    -0x50(%rbp),%rdi
mov    -0x60(%rbp),%rax
mov    -0x50(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
lea    -0x70(%rbp),%rdx
call   1030 <str_next@plt>
mov    %eax,-0x80(%rbp)
cmpl   $0x0,-0x80(%rbp)
jne    16ba <fnmatch_internal+0x57a>
mov    0x2938(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    17ba <fnmatch_internal+0x67a>
cmpl   $0xfffffffd,-0x7c(%rbp)
jne    16ec <fnmatch_internal+0x5ac>
mov    -0x38(%rbp),%rdi
xor    %eax,%eax
sub    -0x68(%rbp),%rax
add    %rax,%rdi
mov    -0x80(%rbp),%esi
call   1050 <match_bracket@plt>
cmp    $0x0,%eax
jne    16e7 <fnmatch_internal+0x5a7>
jmp    171d <fnmatch_internal+0x5dd>
jmp    170c <fnmatch_internal+0x5cc>
cmpl   $0xfffffffc,-0x7c(%rbp)
je     1707 <fnmatch_internal+0x5c7>
mov    -0x80(%rbp),%eax
cmp    -0x7c(%rbp),%eax
je     1707 <fnmatch_internal+0x5c7>
jmp    171d <fnmatch_internal+0x5dd>
jmp    170c <fnmatch_internal+0x5cc>
mov    -0x70(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
jmp    1637 <fnmatch_internal+0x4f7>
cmpl   $0xfffffffb,-0x7c(%rbp)
jne    172c <fnmatch_internal+0x5ec>
jmp    1619 <fnmatch_internal+0x4d9>
mov    -0x20(%rbp),%rdi
mov    -0x60(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
lea    -0x70(%rbp),%rdx
call   1030 <str_next@plt>
mov    %eax,-0x80(%rbp)
cmpl   $0x0,-0x80(%rbp)
jle    1764 <fnmatch_internal+0x624>
mov    -0x70(%rbp),%rax
add    -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    17ae <fnmatch_internal+0x66e>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x60(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%esi
lea    -0x70(%rbp),%rdx
call   1030 <str_next@plt>
cmp    $0x0,%eax
jge    17a9 <fnmatch_internal+0x669>
jmp    1798 <fnmatch_internal+0x658>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1770 <fnmatch_internal+0x630>
jmp    17ae <fnmatch_internal+0x66e>
jmp    1619 <fnmatch_internal+0x4d9>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fnmatch_internal>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %r8d,%r14d
mov    %rcx,0x18(%rsp)
mov    %rsi,%r15
mov    %rdi,%rbx
mov    0x2e75(%rip),%rax
test   %r8d,(%rax)
je     117a <fnmatch_internal+0x3a>
mov    %rdx,%r12
cmpb   $0x2e,(%rdx)
jne    119e <fnmatch_internal+0x5e>
cmpb   $0x2e,(%rbx)
je     119e <fnmatch_internal+0x5e>
jmp    1424 <fnmatch_internal+0x2e4>
mov    %rdx,%r12
jmp    119e <fnmatch_internal+0x5e>
nop
cmp    %ebp,%eax
jne    1424 <fnmatch_internal+0x2e4>
add    %rbx,%r12
sub    %rbx,0x18(%rsp)
mov    0x8(%rsp),%rax
mov    %r13,%rbx
add    %rax,%rbx
sub    %rax,%r15
lea    0x8(%rsp),%rdx
mov    %rbx,%rdi
mov    %r15d,%esi
mov    %r14d,%ecx
call   1060 <pat_next@plt>
cmp    $0xfffffffb,%eax
je     1200 <fnmatch_internal+0xc0>
mov    %eax,%ebp
cmp    $0xfffffffe,%eax
je     1424 <fnmatch_internal+0x2e4>
lea    0x28(%rsp),%rdx
mov    %r12,%rdi
mov    0x18(%rsp),%rsi
call   1030 <str_next@plt>
test   %eax,%eax
jle    1290 <fnmatch_internal+0x150>
mov    %rbx,%r13
mov    0x28(%rsp),%rbx
cmp    $0xfffffffc,%ebp
je     1188 <fnmatch_internal+0x48>
cmp    $0xfffffffd,%ebp
jne    1180 <fnmatch_internal+0x40>
mov    %r13,%rdi
mov    %eax,%esi
call   1050 <match_bracket@plt>
test   %eax,%eax
jne    1188 <fnmatch_internal+0x48>
jmp    1424 <fnmatch_internal+0x2e4>
mov    %r14d,0x14(%rsp)
lea    0x1(%rbx),%rdi
add    $0xffffffffffffffff,%r15
mov    %rdi,0x40(%rsp)
mov    %r15,%rsi
call   1040 <strnlen@plt>
mov    %rax,%r15
add    %rbx,%rax
add    $0x1,%rax
mov    %rax,0x30(%rsp)
test   %r15,%r15
jle    1343 <fnmatch_internal+0x203>
mov    $0x1,%eax
mov    %rax,0x20(%rsp)
xor    %ebp,%ebp
mov    $0x1,%r14d
mov    %r12,%r13
mov    0x30(%rsp),%r12
jmp    1265 <fnmatch_internal+0x125>
xchg   %ax,%ax
lea    0x1(%r14),%rax
mov    %rax,0x20(%rsp)
xor    %ebp,%ebp
add    0x8(%rsp),%r14
cmp    %r15,%r14
jg     129d <fnmatch_internal+0x15d>
lea    (%rbx,%r14,1),%rdi
mov    %r12d,%esi
sub    %edi,%esi
lea    0x8(%rsp),%rdx
mov    0x14(%rsp),%ecx
call   1060 <pat_next@plt>
cmp    $0xfffffffb,%eax
je     1250 <fnmatch_internal+0x110>
cmp    $0xfffffffe,%eax
je     1424 <fnmatch_internal+0x2e4>
add    $0x1,%rbp
jmp    125b <fnmatch_internal+0x11b>
test   %ebp,%ebp
jne    1424 <fnmatch_internal+0x2e4>
jmp    142d <fnmatch_internal+0x2ed>
mov    %r13,%rdi
mov    0x18(%rsp),%rsi
call   1040 <strnlen@plt>
cmp    %rbp,%rax
jb     1424 <fnmatch_internal+0x2e4>
lea    (%rax,%r13,1),%r15
test   %rbp,%rbp
setne  %cl
mov    %r15,%r14
test   %rax,%rax
jle    1334 <fnmatch_internal+0x1f4>
test   %rbp,%rbp
je     1334 <fnmatch_internal+0x1f4>
mov    %r15,%rax
nopl   (%rax)
mov    -0x1(%rax),%cl
test   %cl,%cl
js     12e0 <fnmatch_internal+0x1a0>
add    $0xffffffffffffffff,%rax
mov    %rax,%r14
jmp    1320 <fnmatch_internal+0x1e0>
lea    -0x1(%rax),%r14
and    $0xc0,%cl
cmp    $0x80,%cl
jne    1320 <fnmatch_internal+0x1e0>
cmp    %r13,%r14
jbe    1320 <fnmatch_internal+0x1e0>
add    $0xfffffffffffffffe,%rax
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rax),%ecx
and    $0xc0,%cl
lea    -0x1(%rax),%r14
cmp    $0x80,%cl
jne    1317 <fnmatch_internal+0x1d7>
cmp    %r13,%rax
mov    %r14,%rax
ja     1300 <fnmatch_internal+0x1c0>
add    $0x1,%r14
nopl   0x0(%rax,%rax,1)
add    $0xffffffffffffffff,%rbp
setne  %cl
cmp    %r13,%r14
jbe    1334 <fnmatch_internal+0x1f4>
mov    %r14,%rax
test   %rbp,%rbp
jne    12d0 <fnmatch_internal+0x190>
test   %cl,%cl
jne    1424 <fnmatch_internal+0x2e4>
add    0x20(%rsp),%rbx
jmp    136f <fnmatch_internal+0x22f>
add    $0x1,%rbx
mov    %r12,%r13
mov    %r12,%rdi
mov    0x18(%rsp),%rsi
call   1040 <strnlen@plt>
mov    %rax,%r14
add    %r12,%r14
mov    $0x1,%eax
mov    %rax,0x20(%rsp)
mov    %r14,%r15
mov    0x30(%rsp),%r12
mov    %rbx,0x18(%rsp)
mov    %r12d,%esi
sub    %ebx,%esi
lea    0x8(%rsp),%rdx
mov    %rbx,%rdi
mov    0x14(%rsp),%ecx
call   1060 <pat_next@plt>
mov    %eax,%ebx
mov    0x8(%rsp),%rbp
mov    %r15,%r12
mov    %r15d,%esi
sub    %r14d,%esi
lea    0x28(%rsp),%rdx
mov    %r14,%rdi
call   1030 <str_next@plt>
test   %eax,%eax
jle    1420 <fnmatch_internal+0x2e0>
add    0x18(%rsp),%rbp
mov    %r14,%r15
jmp    13fc <fnmatch_internal+0x2bc>
cs nopw 0x0(%rax,%rax,1)
nop
cmp    %ebx,%eax
jne    1424 <fnmatch_internal+0x2e4>
mov    0x30(%rsp),%rax
mov    %eax,%esi
sub    %ebp,%esi
mov    %rbp,%rdi
lea    0x8(%rsp),%rdx
mov    0x14(%rsp),%ecx
call   1060 <pat_next@plt>
mov    %eax,%ebx
add    0x8(%rsp),%rbp
mov    %r12d,%esi
sub    %r15d,%esi
mov    %r15,%rdi
lea    0x28(%rsp),%rdx
call   1030 <str_next@plt>
test   %eax,%eax
jle    1420 <fnmatch_internal+0x2e0>
add    0x28(%rsp),%r15
cmp    $0xfffffffc,%ebx
je     13c4 <fnmatch_internal+0x284>
cmp    $0xfffffffd,%ebx
jne    13c0 <fnmatch_internal+0x280>
mov    %rbp,%rdi
sub    0x8(%rsp),%rdi
mov    %eax,%esi
call   1050 <match_bracket@plt>
test   %eax,%eax
jne    13c4 <fnmatch_internal+0x284>
jmp    1424 <fnmatch_internal+0x2e4>
test   %ebx,%ebx
je     143e <fnmatch_internal+0x2fe>
mov    0x2bbd(%rip),%rax
mov    (%rax),%ebp
mov    %ebp,%eax
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ebp,%ebp
cmpq   $0x2,0x20(%rsp)
jl     142d <fnmatch_internal+0x2ed>
lea    -0x1(%r14),%eax
mov    %eax,0x3c(%rsp)
mov    0x18(%rsp),%rax
mov    0x40(%rsp),%r12
mov    %eax,%ebx
sub    %r12d,%ebx
mov    %r12,%rdi
mov    %ebx,%esi
lea    0x8(%rsp),%rdx
mov    0x14(%rsp),%ecx
call   1060 <pat_next@plt>
mov    0x8(%rsp),%r15
add    %r12,%r15
cmp    $0xfffffffb,%eax
jne    1494 <fnmatch_internal+0x354>
mov    %r13,%rbx
mov    %r15,%r12
mov    %rbx,%r13
mov    0x18(%rsp),%rax
cmp    %rax,%r15
jb     145a <fnmatch_internal+0x31a>
jmp    142d <fnmatch_internal+0x2ed>
mov    %r13,0x20(%rsp)
mov    %ebx,0x30(%rsp)
mov    0x20(%rsp),%rbx
jmp    14d3 <fnmatch_internal+0x393>
cmp    %r13d,%eax
jne    150f <fnmatch_internal+0x3cf>
add    0x28(%rsp),%rbx
mov    0x18(%rsp),%rax
mov    %eax,%esi
sub    %r15d,%esi
mov    %r15,%rdi
lea    0x8(%rsp),%rdx
mov    0x14(%rsp),%ecx
call   1060 <pat_next@plt>
add    0x8(%rsp),%r15
cmp    $0xfffffffb,%eax
je     1482 <fnmatch_internal+0x342>
mov    %eax,%r13d
mov    %r14d,%esi
sub    %ebx,%esi
mov    %rbx,%rdi
lea    0x28(%rsp),%rdx
call   1030 <str_next@plt>
test   %eax,%eax
je     1424 <fnmatch_internal+0x2e4>
cmp    $0xfffffffc,%r13d
je     14a9 <fnmatch_internal+0x369>
cmp    $0xfffffffd,%r13d
jne    14a4 <fnmatch_internal+0x364>
mov    %r15,%rdi
sub    0x8(%rsp),%rdi
mov    %eax,%esi
call   1050 <match_bracket@plt>
test   %eax,%eax
jne    14a9 <fnmatch_internal+0x369>
mov    %r14d,%esi
mov    0x20(%rsp),%r13
sub    %r13d,%esi
mov    %r13,%rdi
lea    0x28(%rsp),%r15
mov    %r15,%rdx
call   1030 <str_next@plt>
test   %eax,%eax
jle    1535 <fnmatch_internal+0x3f5>
add    0x28(%rsp),%r13
jmp    1554 <fnmatch_internal+0x414>
mov    0x3c(%rsp),%ebx
sub    %r13d,%ebx
add    $0x1,%r13
mov    %r13,%rdi
mov    %ebx,%esi
mov    %r15,%rdx
call   1030 <str_next@plt>
add    $0xffffffff,%ebx
test   %eax,%eax
js     153c <fnmatch_internal+0x3fc>
mov    %r12,%rbx
mov    %r12,%rdi
mov    0x30(%rsp),%esi
lea    0x8(%rsp),%rdx
mov    0x14(%rsp),%ecx
call   1060 <pat_next@plt>
mov    0x8(%rsp),%r15
add    %r12,%r15
mov    %r13,0x20(%rsp)
mov    %r13,%rbx
cmp    $0xfffffffb,%eax
jne    149d <fnmatch_internal+0x35d>
jmp    1482 <fnmatch_internal+0x342>

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

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