#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 */
struct stat {
  int /*<<< orphan*/ st_mode;
};
struct match {
  int dummy;
};
struct dirent {
  int d_type;
  char *d_name;
};
typedef size_t ptrdiff_t;
typedef int /*<<< orphan*/ DIR;

/* Variables and functions */
int DT_DIR;
int DT_LNK;
int DT_REG;
int ENOENT;
int FNM_NOESCAPE;
int FNM_PERIOD;
int GLOB_ABORTED;
int GLOB_ERR;
int GLOB_MARK;
int GLOB_NOESCAPE;
int GLOB_NOSPACE;
int GLOB_PERIOD;
size_t PATH_MAX;
scalar_t__ S_ISDIR(int /*<<< orphan*/);
scalar_t__ append(struct match **, char *, size_t, int);
int /*<<< orphan*/ closedir(int /*<<< orphan*/ *);
int errno;
scalar_t__ fnmatch(char *, char *, int);
scalar_t__ lstat(char *, struct stat *);
int /*<<< orphan*/ memcpy(char *, char *, size_t);
int /*<<< orphan*/ *opendir(char *);
struct dirent *readdir(int /*<<< orphan*/ *);
int /*<<< orphan*/ stat(char *, struct stat *);
char *strchr(char *, char);
size_t strlen(char *);
int do_glob(char *buf, size_t pos, int type, char *pat, int flags,
            int (*errfunc)(const char *path, int err), struct match **tail) {
  if (!type && !(flags & GLOB_MARK))
    type = DT_REG;
  if (*pat && type != DT_DIR)
    type = 0;
  while (pos + 1 < PATH_MAX && *pat == '/')
    buf[pos++] = *pat++;
  ptrdiff_t i = 0, j = 0;
  int in_bracket = 0, overflow = 0;
  for (; pat[i] != '*' && pat[i] != '?' && (!in_bracket || pat[i] != ']');
       i++) {
    if (!pat[i]) {
      if (overflow)
        return 0;
      pat += i;
      pos += j;
      i = j = 0;
      break;
    } else if (pat[i] == '[') {
      in_bracket = 1;
    } else if (pat[i] == '\\' && !(flags & GLOB_NOESCAPE)) {
      if (in_bracket && pat[i + 1] == ']')
        break;
      if (!pat[i + 1])
        return 0;
      i++;
    }
    if (pat[i] == '/') {
      if (overflow)
        return 0;
      in_bracket = 0;
      pat += i + 1;
      i = -1;
      pos += j + 1;
      j = -1;
    }
    if (pos + (j + 1) < PATH_MAX) {
      buf[pos + j++] = pat[i];
    } else if (in_bracket) {
      overflow = 1;
    } else {
      return 0;
    }
    type = 0;
  }
  buf[pos] = 0;
  if (!*pat) {
    struct stat st;
    if ((flags & GLOB_MARK) && (!type || type == DT_LNK) && !stat(buf, &st)) {
      if (S_ISDIR(st.st_mode))
        type = DT_DIR;
      else
        type = DT_REG;
    }
    if (!type && lstat(buf, &st)) {
      if (errno != ENOENT && (errfunc(buf, errno) || (flags & GLOB_ERR)))
        return GLOB_ABORTED;
      return 0;
    }
    if (append(tail, buf, pos, (flags & GLOB_MARK) && type == DT_DIR))
      return GLOB_NOSPACE;
    return 0;
  }
  char *p2 = strchr(pat, '/'), saved_sep = '/';
  if (p2 && !(flags & GLOB_NOESCAPE)) {
    char *p;
    for (p = p2; p > pat && p[-1] == '\\'; p--)
      ;
    if ((p2 - p) % 2) {
      p2--;
      saved_sep = '\\';
    }
  }
  DIR *dir = opendir(pos ? buf : ".");
  if (!dir) {
    if (errfunc(buf, errno) || (flags & GLOB_ERR))
      return GLOB_ABORTED;
    return 0;
  }
  int old_errno = errno;
  struct dirent *de;
  while (errno = 0, de = readdir(dir)) {
    if (p2 && de->d_type && de->d_type != DT_DIR && de->d_type != DT_LNK)
      continue;
    size_t l = strlen(de->d_name);
    if (l >= PATH_MAX - pos)
      continue;
    if (p2)
      *p2 = 0;
    int fnm_flags = ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0) |
                    ((!(flags & GLOB_PERIOD)) ? FNM_PERIOD : 0);
    if (fnmatch(pat, de->d_name, fnm_flags))
      continue;
    if (p2 && (flags & GLOB_PERIOD) && de->d_name[0] == '.' &&
        (!de->d_name[1] || de->d_name[1] == '.' && !de->d_name[2]) &&
        fnmatch(pat, de->d_name, fnm_flags | FNM_PERIOD))
      continue;
    memcpy(buf + pos, de->d_name, l + 1);
    if (p2)
      *p2 = saved_sep;
    int r =
        do_glob(buf, pos + l, de->d_type, p2 ? p2 : "", flags, errfunc, tail);
    if (r) {
      closedir(dir);
      return r;
    }
  }
  int readerr = errno;
  if (p2)
    *p2 = saved_sep;
  closedir(dir);
  if (readerr && (errfunc(buf, errno) || (flags & GLOB_ERR)))
    return GLOB_ABORTED;
  errno = old_errno;
  return 0;
}


x86 assembly (clang, -O0):
<do_glob>:
push   %rbp
mov    %rsp,%rbp
sub    $0x100,%rsp
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8d,-0x2c(%rbp)
mov    %r9,-0x38(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    1211 <do_glob+0x51>
mov    -0x2c(%rbp),%eax
mov    0x2dce(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
jne    1211 <do_glob+0x51>
mov    0x2d9c(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     123a <do_glob+0x7a>
mov    -0x1c(%rbp),%eax
mov    0x2d6d(%rip),%rcx
cmp    (%rcx),%eax
je     123a <do_glob+0x7a>
movl   $0x0,-0x1c(%rbp)
jmp    123f <do_glob+0x7f>
mov    -0x18(%rbp),%rcx
add    $0x1,%rcx
xor    %eax,%eax
mov    0x2d98(%rip),%rdx
cmp    (%rdx),%rcx
mov    %al,-0x9d(%rbp)
jae    1272 <do_glob+0xb2>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
sete   %al
mov    %al,-0x9d(%rbp)
mov    -0x9d(%rbp),%al
test   $0x1,%al
jne    1285 <do_glob+0xc5>
jmp    12b1 <do_glob+0xf1>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x18(%rbp)
mov    %dl,(%rax,%rcx,1)
jmp    123f <do_glob+0x7f>
movq   $0x0,-0x40(%rbp)
movq   $0x0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x2a,%ecx
mov    %al,-0x9e(%rbp)
je     133f <do_glob+0x17f>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x3f,%ecx
mov    %al,-0x9e(%rbp)
je     133f <do_glob+0x17f>
mov    $0x1,%al
cmpl   $0x0,-0x4c(%rbp)
mov    %al,-0x9f(%rbp)
je     1333 <do_glob+0x173>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5d,%eax
setne  %al
mov    %al,-0x9f(%rbp)
mov    -0x9f(%rbp),%al
mov    %al,-0x9e(%rbp)
mov    -0x9e(%rbp),%al
test   $0x1,%al
jne    1352 <do_glob+0x192>
jmp    1539 <do_glob+0x379>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    13a7 <do_glob+0x1e7>
cmpl   $0x0,-0x50(%rbp)
je     137a <do_glob+0x1ba>
movl   $0x0,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
mov    -0x40(%rbp),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x48(%rbp),%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
movq   $0x0,-0x48(%rbp)
movq   $0x0,-0x40(%rbp)
jmp    1539 <do_glob+0x379>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5b,%eax
jne    13c8 <do_glob+0x208>
movl   $0x1,-0x4c(%rbp)
jmp    1447 <do_glob+0x287>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5c,%eax
jne    1442 <do_glob+0x282>
mov    -0x2c(%rbp),%eax
mov    0x2be9(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
jne    1442 <do_glob+0x282>
cmpl   $0x0,-0x4c(%rbp)
je     1417 <do_glob+0x257>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl 0x1(%rax,%rcx,1),%eax
cmp    $0x5d,%eax
jne    1417 <do_glob+0x257>
jmp    1539 <do_glob+0x379>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
cmpb   $0x0,0x1(%rax,%rcx,1)
jne    1436 <do_glob+0x276>
movl   $0x0,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1447 <do_glob+0x287>
jmp    144c <do_glob+0x28c>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
jne    14ae <do_glob+0x2ee>
cmpl   $0x0,-0x50(%rbp)
je     1477 <do_glob+0x2b7>
movl   $0x0,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
movl   $0x0,-0x4c(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
movq   $0xffffffffffffffff,-0x40(%rbp)
ff
mov    -0x48(%rbp),%rax
add    $0x1,%rax
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
movq   $0xffffffffffffffff,-0x48(%rbp)
ff
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%rcx
add    $0x1,%rcx
add    %rcx,%rax
mov    0x2b24(%rip),%rcx
cmp    (%rcx),%rax
jae    14fa <do_glob+0x33a>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
mov    -0x48(%rbp),%rsi
mov    %rsi,%rdi
add    $0x1,%rdi
mov    %rdi,-0x48(%rbp)
add    %rsi,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1521 <do_glob+0x361>
cmpl   $0x0,-0x4c(%rbp)
je     1510 <do_glob+0x350>
movl   $0x1,-0x50(%rbp)
jmp    151c <do_glob+0x35c>
movl   $0x0,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
jmp    1521 <do_glob+0x361>
movl   $0x0,-0x1c(%rbp)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    12cf <do_glob+0x10f>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
cmpb   $0x0,(%rax)
jne    16f3 <do_glob+0x533>
mov    -0x2c(%rbp),%eax
mov    0x2a6c(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     15cd <do_glob+0x40d>
cmpl   $0x0,-0x1c(%rbp)
je     1583 <do_glob+0x3c3>
mov    -0x1c(%rbp),%eax
mov    0x2a0d(%rip),%rcx
cmp    (%rcx),%eax
jne    15cd <do_glob+0x40d>
mov    -0x10(%rbp),%rdi
lea    -0x58(%rbp),%rsi
call   10b0 <stat@plt>
cmp    $0x0,%eax
jne    15cd <do_glob+0x40d>
mov    -0x58(%rbp),%edi
call   1070 <S_ISDIR@plt>
cmp    $0x0,%rax
je     15bc <do_glob+0x3fc>
mov    0x29e6(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x1c(%rbp)
jmp    15c8 <do_glob+0x408>
mov    0x29e5(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x1c(%rbp)
jmp    15cd <do_glob+0x40d>
cmpl   $0x0,-0x1c(%rbp)
jne    1654 <do_glob+0x494>
mov    -0x10(%rbp),%rdi
lea    -0x58(%rbp),%rsi
call   10a0 <lstat@plt>
cmp    $0x0,%rax
je     1654 <do_glob+0x494>
mov    0x299b(%rip),%rax
mov    (%rax),%eax
mov    0x2972(%rip),%rcx
cmp    (%rcx),%eax
je     1648 <do_glob+0x488>
mov    -0x38(%rbp),%rax
mov    -0x10(%rbp),%rdi
mov    0x297b(%rip),%rcx
mov    (%rcx),%esi
call   *%rax
cmp    $0x0,%eax
jne    1637 <do_glob+0x477>
mov    -0x2c(%rbp),%eax
mov    0x29b4(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1648 <do_glob+0x488>
mov    0x2942(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
movl   $0x0,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
mov    0x10(%rbp),%rax
mov    %rax,-0xb8(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0xb0(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0xa8(%rbp)
mov    -0x2c(%rbp),%ecx
mov    0x2949(%rip),%rax
and    (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xa0(%rbp)
je     16a7 <do_glob+0x4e7>
mov    -0x1c(%rbp),%eax
mov    0x28fc(%rip),%rcx
cmp    (%rcx),%eax
sete   %al
mov    %al,-0xa0(%rbp)
mov    -0xa8(%rbp),%rdx
mov    -0xb0(%rbp),%rsi
mov    -0xb8(%rbp),%rdi
mov    -0xa0(%rbp),%al
and    $0x1,%al
movzbl %al,%ecx
call   1030 <append@plt>
cmp    $0x0,%rax
je     16e7 <do_glob+0x527>
mov    0x28e3(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
movl   $0x0,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
mov    -0x28(%rbp),%rdi
mov    $0x2f,%esi
call   1060 <strchr@plt>
mov    %rax,-0x60(%rbp)
movb   $0x2f,-0x61(%rbp)
cmpq   $0x0,-0x60(%rbp)
je     17b8 <do_glob+0x5f8>
mov    -0x2c(%rbp),%eax
mov    0x28b2(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
jne    17b8 <do_glob+0x5f8>
mov    -0x60(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x70(%rbp),%rcx
xor    %eax,%eax
cmp    -0x28(%rbp),%rcx
mov    %al,-0xb9(%rbp)
jbe    175b <do_glob+0x59b>
mov    -0x70(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x5c,%eax
sete   %al
mov    %al,-0xb9(%rbp)
mov    -0xb9(%rbp),%al
test   $0x1,%al
jne    176e <do_glob+0x5ae>
jmp    1784 <do_glob+0x5c4>
jmp    1773 <do_glob+0x5b3>
mov    -0x70(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x70(%rbp)
jmp    1731 <do_glob+0x571>
mov    -0x60(%rbp),%rax
mov    -0x70(%rbp),%rcx
sub    %rcx,%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
je     17b3 <do_glob+0x5f3>
mov    -0x60(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x60(%rbp)
movb   $0x5c,-0x61(%rbp)
jmp    17b8 <do_glob+0x5f8>
cmpq   $0x0,-0x18(%rbp)
je     17d3 <do_glob+0x613>
mov    -0x10(%rbp),%rax
mov    %rax,-0xc8(%rbp)
jmp    17e6 <do_glob+0x626>
lea    0x826(%rip),%rax
mov    %rax,-0xc8(%rbp)
jmp    17e6 <do_glob+0x626>
mov    -0xc8(%rbp),%rdi
call   1040 <opendir@plt>
mov    %rax,-0x78(%rbp)
cmpq   $0x0,-0x78(%rbp)
jne    184f <do_glob+0x68f>
mov    -0x38(%rbp),%rax
mov    -0x10(%rbp),%rdi
mov    0x2780(%rip),%rcx
mov    (%rcx),%esi
call   *%rax
cmp    $0x0,%eax
jne    1832 <do_glob+0x672>
mov    -0x2c(%rbp),%eax
mov    0x27b9(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1843 <do_glob+0x683>
mov    0x2747(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
movl   $0x0,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
mov    0x273a(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x7c(%rbp)
mov    0x272e(%rip),%rax
movl   $0x0,(%rax)
mov    -0x78(%rbp),%rdi
call   10d0 <readdir@plt>
mov    %rax,-0x88(%rbp)
cmp    $0x0,%rax
je     1b6e <do_glob+0x9ae>
cmpq   $0x0,-0x60(%rbp)
je     18d2 <do_glob+0x712>
mov    -0x88(%rbp),%rax
cmpl   $0x0,(%rax)
je     18d2 <do_glob+0x712>
mov    -0x88(%rbp),%rax
mov    (%rax),%eax
mov    0x26eb(%rip),%rcx
cmp    (%rcx),%eax
je     18d2 <do_glob+0x712>
mov    -0x88(%rbp),%rax
mov    (%rax),%eax
mov    0x26c3(%rip),%rcx
cmp    (%rcx),%eax
je     18d2 <do_glob+0x712>
jmp    185b <do_glob+0x69b>
mov    -0x88(%rbp),%rax
mov    0x8(%rax),%rdi
call   1050 <strlen@plt>
mov    %rax,-0x90(%rbp)
mov    -0x90(%rbp),%rax
mov    0x26f1(%rip),%rcx
mov    (%rcx),%rcx
sub    -0x18(%rbp),%rcx
cmp    %rcx,%rax
jb     190c <do_glob+0x74c>
jmp    185b <do_glob+0x69b>
cmpq   $0x0,-0x60(%rbp)
je     191e <do_glob+0x75e>
mov    -0x60(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x2c(%rbp),%eax
mov    0x26a8(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1947 <do_glob+0x787>
mov    0x26be(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0xcc(%rbp)
jmp    1954 <do_glob+0x794>
xor    %eax,%eax
mov    %eax,-0xcc(%rbp)
jmp    1954 <do_glob+0x794>
mov    -0xcc(%rbp),%eax
mov    %eax,-0xd0(%rbp)
mov    -0x2c(%rbp),%eax
mov    0x2636(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
jne    1989 <do_glob+0x7c9>
mov    0x2634(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0xd4(%rbp)
jmp    1996 <do_glob+0x7d6>
xor    %eax,%eax
mov    %eax,-0xd4(%rbp)
jmp    1996 <do_glob+0x7d6>
mov    -0xd0(%rbp),%eax
mov    -0xd4(%rbp),%ecx
or     %ecx,%eax
mov    %eax,-0x94(%rbp)
mov    -0x28(%rbp),%rdi
mov    -0x88(%rbp),%rax
mov    0x8(%rax),%rsi
mov    -0x94(%rbp),%edx
call   1080 <fnmatch@plt>
cmp    $0x0,%rax
je     19d3 <do_glob+0x813>
jmp    185b <do_glob+0x69b>
cmpq   $0x0,-0x60(%rbp)
je     1a7e <do_glob+0x8be>
mov    -0x2c(%rbp),%eax
mov    0x25b8(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1a7e <do_glob+0x8be>
mov    -0x88(%rbp),%rax
mov    0x8(%rax),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1a7e <do_glob+0x8be>
mov    -0x88(%rbp),%rax
mov    0x8(%rax),%rax
cmpb   $0x0,0x1(%rax)
je     1a4c <do_glob+0x88c>
mov    -0x88(%rbp),%rax
mov    0x8(%rax),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    1a7e <do_glob+0x8be>
mov    -0x88(%rbp),%rax
mov    0x8(%rax),%rax
cmpb   $0x0,0x2(%rax)
jne    1a7e <do_glob+0x8be>
mov    -0x28(%rbp),%rdi
mov    -0x88(%rbp),%rax
mov    0x8(%rax),%rsi
mov    -0x94(%rbp),%edx
mov    0x2548(%rip),%rax
or     (%rax),%edx
call   1080 <fnmatch@plt>
cmp    $0x0,%rax
je     1a7e <do_glob+0x8be>
jmp    185b <do_glob+0x69b>
mov    -0x10(%rbp),%rdi
add    -0x18(%rbp),%rdi
mov    -0x88(%rbp),%rax
mov    0x8(%rax),%rsi
mov    -0x90(%rbp),%rdx
add    $0x1,%rdx
call   10c0 <memcpy@plt>
cmpq   $0x0,-0x60(%rbp)
je     1ab5 <do_glob+0x8f5>
mov    -0x61(%rbp),%cl
mov    -0x60(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,-0xe8(%rbp)
mov    -0x18(%rbp),%rax
add    -0x90(%rbp),%rax
mov    %rax,-0xe0(%rbp)
mov    -0x88(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0xd8(%rbp)
cmpq   $0x0,-0x60(%rbp)
je     1afc <do_glob+0x93c>
mov    -0x60(%rbp),%rax
mov    %rax,-0xf0(%rbp)
jmp    1b0f <do_glob+0x94f>
lea    0x4fe(%rip),%rax
mov    %rax,-0xf0(%rbp)
jmp    1b0f <do_glob+0x94f>
mov    -0xd8(%rbp),%edx
mov    -0xe0(%rbp),%rsi
mov    -0xe8(%rbp),%rdi
mov    -0xf0(%rbp),%rcx
mov    -0x2c(%rbp),%r8d
mov    -0x38(%rbp),%r9
mov    0x10(%rbp),%rax
mov    %rax,(%rsp)
call   10e0 <do_glob@plt>
mov    %eax,-0x98(%rbp)
cmpl   $0x0,-0x98(%rbp)
je     1b69 <do_glob+0x9a9>
mov    -0x78(%rbp),%rdi
call   1090 <closedir@plt>
mov    -0x98(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
jmp    185b <do_glob+0x69b>
mov    0x241b(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x9c(%rbp)
cmpq   $0x0,-0x60(%rbp)
je     1b91 <do_glob+0x9d1>
mov    -0x61(%rbp),%cl
mov    -0x60(%rbp),%rax
mov    %cl,(%rax)
mov    -0x78(%rbp),%rdi
call   1090 <closedir@plt>
cmpl   $0x0,-0x9c(%rbp)
je     1be9 <do_glob+0xa29>
mov    -0x38(%rbp),%rax
mov    -0x10(%rbp),%rdi
mov    0x23da(%rip),%rcx
mov    (%rcx),%esi
call   *%rax
cmp    $0x0,%eax
jne    1bd8 <do_glob+0xa18>
mov    -0x2c(%rbp),%eax
mov    0x2413(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1be9 <do_glob+0xa29>
mov    0x23a1(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1bfc <do_glob+0xa3c>
mov    -0x7c(%rbp),%ecx
mov    0x239d(%rip),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x100,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<do_glob>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %r9,%rbp
mov    %rcx,%rbx
mov    %rsi,%r13
mov    %rdi,%r12
test   %edx,%edx
jne    11f5 <do_glob+0x35>
mov    0x2de3(%rip),%rax
xor    %edx,%edx
test   %r8d,(%rax)
jne    11f5 <do_glob+0x35>
mov    0x2db5(%rip),%rax
mov    (%rax),%edx
mov    0x2d9c(%rip),%rax
xor    %r9d,%r9d
cmp    (%rax),%edx
mov    $0x0,%r14d
cmove  %edx,%r14d
mov    (%rbx),%cl
test   %cl,%cl
cmove  %edx,%r14d
lea    0x1(%r13),%rax
mov    0x2dca(%rip),%r10
cmp    (%r10),%rax
jae    124e <do_glob+0x8e>
cmp    $0x2f,%cl
jne    124e <do_glob+0x8e>
add    $0x1,%rbx
mov    %rbx,%rcx
nop
mov    %rax,%r13
mov    %rcx,%rbx
movb   $0x2f,-0x1(%r12,%rax,1)
add    $0x1,%rax
cmp    (%r10),%rax
jae    124e <do_glob+0x8e>
lea    0x1(%rbx),%rcx
cmpb   $0x2f,(%rbx)
je     1230 <do_glob+0x70>
mov    0x2d7b(%rip),%r11
xor    %esi,%esi
xor    %edx,%edx
xor    %ecx,%ecx
xor    %r15d,%r15d
jmp    1275 <do_glob+0xb5>
lea    0x1(%rdx),%rdi
add    %r13,%rdx
mov    %al,(%r12,%rdx,1)
mov    %rdi,%rdx
add    $0x1,%rcx
xor    %r14d,%r14d
movzbl (%rbx,%rcx,1),%eax
cmp    $0x2a,%al
je     1381 <do_glob+0x1c1>
cmp    $0x3f,%al
je     1381 <do_glob+0x1c1>
test   %esi,%esi
je     1295 <do_glob+0xd5>
cmp    $0x5d,%al
je     1381 <do_glob+0x1c1>
cmp    $0x5b,%al
je     12b0 <do_glob+0xf0>
cmp    $0x5c,%al
je     12d0 <do_glob+0x110>
test   %al,%al
je     136f <do_glob+0x1af>
cmp    $0x2f,%al
je     12f8 <do_glob+0x138>
jmp    1340 <do_glob+0x180>
xchg   %ax,%ax
lea    (%rdx,%r13,1),%rax
add    $0x1,%rax
mov    $0x1,%esi
cmp    (%r10),%rax
jae    1364 <do_glob+0x1a4>
lea    0x1(%rdx),%rdi
mov    $0x5b,%al
jmp    1264 <do_glob+0xa4>
xchg   %ax,%ax
mov    $0x5c,%al
test   %r8d,(%r11)
jne    1340 <do_glob+0x180>
movzbl 0x1(%rbx,%rcx,1),%eax
test   %esi,%esi
je     12e8 <do_glob+0x128>
cmp    $0x5d,%al
je     1381 <do_glob+0x1c1>
test   %al,%al
je     16c3 <do_glob+0x503>
add    $0x1,%rcx
cmp    $0x2f,%al
jne    1340 <do_glob+0x180>
test   %r9d,%r9d
jne    1789 <do_glob+0x5c9>
add    %rdx,%r13
add    $0x1,%r13
cmp    (%r10),%r13
jae    1789 <do_glob+0x5c9>
movzbl (%rbx,%rcx,1),%eax
add    %rcx,%rbx
add    $0x1,%rbx
xor    %edi,%edi
mov    $0xffffffffffffffff,%rcx
mov    $0xffffffffffffffff,%rdx
xor    %esi,%esi
jmp    1264 <do_glob+0xa4>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    (%rdx,%r13,1),%rdi
add    $0x1,%rdi
cmp    (%r10),%rdi
jb     1260 <do_glob+0xa0>
mov    $0x1,%r9d
test   %esi,%esi
jne    126e <do_glob+0xae>
jmp    16c3 <do_glob+0x503>
mov    $0x1,%r9d
jmp    126e <do_glob+0xae>
xor    %r15d,%r15d
test   %r9d,%r9d
jne    1789 <do_glob+0x5c9>
add    %rcx,%rbx
add    %rdx,%r13
movb   $0x0,(%r12,%r13,1)
cmpb   $0x0,(%rbx)
mov    %r8d,0x8(%rsp)
je     1404 <do_glob+0x244>
mov    %rbp,%r14
mov    %rbx,%rdi
mov    $0x2f,%esi
call   1060 <strchr@plt>
mov    %rax,%rbp
mov    $0x2f,%al
mov    %eax,0xc(%rsp)
test   %rbp,%rbp
je     1461 <do_glob+0x2a1>
mov    0x8(%rsp),%eax
mov    0x2c13(%rip),%rcx
test   %eax,(%rcx)
jne    1463 <do_glob+0x2a3>
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
mov    %rcx,%rax
add    %rbp,%rcx
cmp    %rbx,%rcx
jbe    13e6 <do_glob+0x226>
lea    -0x1(%rax),%rcx
cmpb   $0x5c,-0x1(%rbp,%rax,1)
je     13d0 <do_glob+0x210>
neg    %eax
and    $0x1,%eax
sub    %rax,%rbp
test   %rax,%rax
mov    $0x2f,%eax
mov    $0x5c,%ecx
cmove  %eax,%ecx
mov    %ecx,0xc(%rsp)
jmp    1463 <do_glob+0x2a3>
mov    0x2bbd(%rip),%rbx
test   %r8d,(%rbx)
je     16fd <do_glob+0x53d>
test   %r14d,%r14d
je     1429 <do_glob+0x269>
mov    0x2b68(%rip),%rax
cmp    (%rax),%r14d
jne    1702 <do_glob+0x542>
lea    0x10(%rsp),%rsi
mov    %r12,%rdi
call   10b0 <stat@plt>
mov    0x8(%rsp),%r8d
test   %eax,%eax
jne    16fd <do_glob+0x53d>
mov    0x10(%rsp),%edi
call   1070 <S_ISDIR@plt>
test   %rax,%rax
je     16ee <do_glob+0x52e>
mov    0x2b3c(%rip),%rax
jmp    16f5 <do_glob+0x535>
xor    %ebp,%ebp
test   %r13,%r13
lea    0xb93(%rip),%rdi
cmovne %r12,%rdi
call   1040 <opendir@plt>
mov    0x2b13(%rip),%rcx
mov    (%rcx),%esi
test   %rax,%rax
je     16cb <do_glob+0x50b>
mov    %esi,0x34(%rsp)
mov    %r14,0x40(%rsp)
mov    %r12,0x18(%rsp)
movl   $0x0,(%rcx)
mov    %rax,0x28(%rsp)
mov    %rax,%rdi
call   10d0 <readdir@plt>
test   %rax,%rax
je     166e <do_glob+0x4ae>
mov    %rax,%r15
mov    0x18(%rsp),%rax
add    %r13,%rax
mov    %rax,0x38(%rsp)
mov    %rbp,0x20(%rsp)
jmp    1512 <do_glob+0x352>
nopl   0x0(%rax)
or     %eax,%r14d
mov    %rbx,%rdi
mov    %r12,%rsi
mov    %r14d,%edx
call   1080 <fnmatch@plt>
test   %rax,%rax
je     15a3 <do_glob+0x3e3>
mov    0x2a9f(%rip),%rax
movl   $0x0,(%rax)
mov    0x28(%rsp),%rdi
call   10d0 <readdir@plt>
mov    %rax,%r15
test   %rax,%rax
mov    0x20(%rsp),%rbp
je     166e <do_glob+0x4ae>
test   %rbp,%rbp
je     1534 <do_glob+0x374>
mov    (%r15),%eax
test   %eax,%eax
je     1534 <do_glob+0x374>
mov    0x2a73(%rip),%rcx
cmp    (%rcx),%eax
je     1534 <do_glob+0x374>
mov    0x2a58(%rip),%rcx
cmp    (%rcx),%eax
jne    14ea <do_glob+0x32a>
mov    0x8(%r15),%r12
mov    %r12,%rdi
call   1050 <strlen@plt>
mov    %rax,%rbp
mov    0x2a9e(%rip),%rax
mov    (%rax),%rax
sub    %r13,%rax
cmp    %rax,%rbp
jae    14ea <do_glob+0x32a>
mov    0x20(%rsp),%rax
test   %rax,%rax
je     1566 <do_glob+0x3a6>
movb   $0x0,(%rax)
mov    0x8(%r15),%r12
mov    0x2a63(%rip),%rax
mov    (%rax),%eax
mov    0x8(%rsp),%edx
and    %edx,%eax
je     1580 <do_glob+0x3c0>
mov    0x2a7a(%rip),%rax
mov    (%rax),%eax
xor    %r14d,%r14d
mov    0x2a16(%rip),%rcx
mov    (%rcx),%ecx
and    %edx,%ecx
jne    14d0 <do_glob+0x310>
mov    0x2a15(%rip),%rcx
mov    (%rcx),%r14d
jmp    14d0 <do_glob+0x310>
cmpq   $0x0,0x20(%rsp)
je     1612 <do_glob+0x452>
mov    0x8(%rsp),%eax
mov    0x29ea(%rip),%rcx
test   %eax,(%rcx)
je     15f3 <do_glob+0x433>
mov    0x8(%r15),%rsi
cmpb   $0x2e,(%rsi)
jne    15f3 <do_glob+0x433>
movzbl 0x1(%rsi),%eax
test   %al,%al
je     15d5 <do_glob+0x415>
cmp    $0x2e,%al
jne    15f3 <do_glob+0x433>
cmpb   $0x0,0x2(%rsi)
jne    15f3 <do_glob+0x433>
mov    0x29d4(%rip),%rax
or     (%rax),%r14d
mov    %rbx,%rdi
mov    %r14d,%edx
call   1080 <fnmatch@plt>
test   %rax,%rax
jne    14ea <do_glob+0x32a>
mov    0x8(%r15),%rsi
lea    0x1(%rbp),%rdx
mov    0x38(%rsp),%rdi
call   10c0 <memcpy@plt>
mov    0x20(%rsp),%rcx
mov    0xc(%rsp),%eax
mov    %al,(%rcx)
jmp    162b <do_glob+0x46b>
mov    0x8(%r15),%rsi
lea    0x1(%rbp),%rdx
mov    0x38(%rsp),%rdi
call   10c0 <memcpy@plt>
lea    0x9d6(%rip),%rcx
mov    0x8(%rsp),%r8d
mov    0x18(%rsp),%rdi
add    %r13,%rbp
mov    (%r15),%edx
mov    0x80(%rsp),%rax
mov    %rax,(%rsp)
mov    %rbp,%rsi
mov    0x40(%rsp),%r9
call   10e0 <do_glob@plt>
test   %eax,%eax
je     14ea <do_glob+0x32a>
mov    %eax,%r15d
mov    0x28(%rsp),%rdi
call   1090 <closedir@plt>
jmp    1789 <do_glob+0x5c9>
mov    0x291b(%rip),%r14
mov    (%r14),%ebx
test   %rbp,%rbp
je     1684 <do_glob+0x4c4>
mov    0xc(%rsp),%eax
mov    %al,0x0(%rbp)
mov    0x28(%rsp),%rdi
call   1090 <closedir@plt>
test   %ebx,%ebx
mov    0x18(%rsp),%rdi
mov    0x40(%rsp),%rax
je     16bc <do_glob+0x4fc>
mov    (%r14),%esi
call   *%rax
test   %eax,%eax
jne    177f <do_glob+0x5bf>
mov    0x2930(%rip),%rax
mov    0x8(%rsp),%ecx
test   %ecx,(%rax)
jne    177f <do_glob+0x5bf>
mov    0x34(%rsp),%eax
mov    %eax,(%r14)
xor    %r15d,%r15d
jmp    1789 <do_glob+0x5c9>
mov    %r12,%rdi
call   *%r14
test   %eax,%eax
jne    177f <do_glob+0x5bf>
mov    0x2900(%rip),%rax
mov    0x8(%rsp),%ecx
test   %ecx,(%rax)
jne    177f <do_glob+0x5bf>
jmp    16c3 <do_glob+0x503>
mov    0x28b3(%rip),%rax
mov    (%rax),%r14d
mov    0x8(%rsp),%r8d
test   %r14d,%r14d
je     173e <do_glob+0x57e>
and    (%rbx),%r8d
setne  %al
mov    0x2889(%rip),%rcx
cmp    (%rcx),%r14d
sete   %cl
and    %al,%cl
movzbl %cl,%ecx
mov    0x80(%rsp),%rdi
mov    %r12,%rsi
mov    %r13,%rdx
call   1030 <append@plt>
xor    %r15d,%r15d
test   %rax,%rax
je     1789 <do_glob+0x5c9>
mov    0x2884(%rip),%rax
jmp    1786 <do_glob+0x5c6>
lea    0x10(%rsp),%rsi
mov    %r12,%rdi
call   10a0 <lstat@plt>
test   %rax,%rax
je     179b <do_glob+0x5db>
mov    0x2839(%rip),%rax
mov    (%rax),%esi
mov    0x2810(%rip),%rax
xor    %r15d,%r15d
cmp    (%rax),%esi
je     1789 <do_glob+0x5c9>
mov    %r12,%rdi
call   *%rbp
test   %eax,%eax
jne    177f <do_glob+0x5bf>
mov    0x2869(%rip),%rax
mov    0x8(%rsp),%ecx
test   %ecx,(%rax)
je     1789 <do_glob+0x5c9>
mov    0x27fa(%rip),%rax
mov    (%rax),%r15d
mov    %r15d,%eax
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %r14d,%r14d
mov    0x8(%rsp),%r8d
jmp    1702 <do_glob+0x542>

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

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