#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 */
typedef struct TYPE_4__ TYPE_1__;

/* Type definitions */
struct TYPE_4__ {
  size_t we_wordc;
  char **we_wordv;
  int we_offs;
};
typedef TYPE_1__ wordexp_t;
typedef scalar_t__ pid_t;
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ SIGKILL;
int SIZE_MAX;
scalar_t__ WEXITSTATUS(int);
int WRDE_APPEND;
int WRDE_BADCHAR;
int WRDE_CMDSUB;
int WRDE_DOOFFS;
int WRDE_NOCMD;
int WRDE_NOSPACE;
int WRDE_REUSE;
int WRDE_SHOWERR;
int WRDE_SYNTAX;
int /*<<< orphan*/ _exit(int);
int /*<<< orphan*/ close(int);
int /*<<< orphan*/ dup2(int, int);
int /*<<< orphan*/ execl(char *, char *, char *, char *, char *, char const *,
                         char *, char *);
int /*<<< orphan*/ fclose(int /*<<< orphan*/ *);
int /*<<< orphan*/ *fdopen(int, char *);
int /*<<< orphan*/ feof(int /*<<< orphan*/ *);
scalar_t__ fork();
int /*<<< orphan*/ free(char **);
char *getword(int /*<<< orphan*/ *);
int /*<<< orphan*/ kill(scalar_t__, int /*<<< orphan*/);
scalar_t__ pipe(int *);
char **realloc(char **, size_t);
int /*<<< orphan*/ waitpid(scalar_t__, int *, int /*<<< orphan*/);
int /*<<< orphan*/ wordfree(TYPE_1__ *);
int do_wordexp(const char *s, wordexp_t *we, int flags) {
  size_t i, l;
  int sq = 0, dq = 0;
  size_t np = 0;
  char *w, **tmp;
  char *redir = (flags & WRDE_SHOWERR) ? "" : "2>/dev/null";
  int err = 0, status;
  FILE *f;
  size_t wc = 0;
  char **wv = 0;
  int p[2];
  pid_t pid;
  if (flags & WRDE_REUSE)
    wordfree(we);
  if (flags & WRDE_NOCMD)
    for (i = 0; s[i]; i++)
      switch (s[i]) {
      case '\\':
        if (!sq)
          i++;
        break;
      case '\'':
        if (!dq)
          sq ^= 1;
        break;
      case '"':
        if (!sq)
          dq ^= 1;
        break;
      case '(':
        if (np) {
          np++;
          break;
        }
      case ')':
        if (np) {
          np--;
          break;
        }
      case '\n':
      case '|':
      case '&':
      case ';':
      case '<':
      case '>':
      case '{':
      case '}':
        if (!(sq | dq | np))
          return WRDE_BADCHAR;
        break;
      case '$':
        if (s[i + 1] == '(' && s[i + 2] == '(') {
          i += 2;
          np += 2;
          break;
        } else if (s[i + 1] != '(')
          break;
      case '`':
        if (sq)
          break;
        return WRDE_CMDSUB;
      }
  if (flags & WRDE_APPEND) {
    wc = we->we_wordc;
    wv = we->we_wordv;
  }
  i = wc;
  if (flags & WRDE_DOOFFS) {
    if (we->we_offs > SIZE_MAX / sizeof(void *) / 4)
      return WRDE_NOSPACE;
    i += we->we_offs;
  } else {
    we->we_offs = 0;
  }
  if (pipe(p) < 0)
    return WRDE_NOSPACE;
  pid = fork();
  if (pid < 0) {
    close(p[0]);
    close(p[1]);
    return WRDE_NOSPACE;
  }
  if (!pid) {
    dup2(p[1], 1);
    close(p[0]);
    close(p[1]);
    execl("/bin/sh", "sh", "-c", "eval \"printf %s\\\\\\\\0 $1 $2\"", "sh", s,
          redir, (char *)0);
    _exit(1);
  }
  close(p[1]);
  f = fdopen(p[0], "r");
  if (!f) {
    close(p[0]);
    kill(pid, SIGKILL);
    waitpid(pid, &status, 0);
    return WRDE_NOSPACE;
  }
  l = wv ? i + 1 : 0;
  while ((w = getword(f))) {
    if (i + 1 >= l) {
      l += l / 2 + 10;
      tmp = realloc(wv, l * sizeof(char *));
      if (!tmp)
        break;
      wv = tmp;
    }
    wv[i++] = w;
    wv[i] = 0;
  }
  if (!feof(f))
    err = WRDE_NOSPACE;
  fclose(f);
  waitpid(pid, &status, 0);
  if (WEXITSTATUS(status)) {
    if (!(flags & WRDE_APPEND)) {
      free(wv);
      return WRDE_SYNTAX;
    } else if (wv == we->we_wordv) {
      return WRDE_SYNTAX;
    }
  }
  we->we_wordv = wv;
  we->we_wordc = i;
  for (i = we->we_offs; i; i--)
    we->we_wordv[i - 1] = 0;
  if (flags & WRDE_DOOFFS)
    we->we_wordc -= we->we_offs;
  return err;
}


x86 assembly (clang, -O0):
<do_wordexp>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x1c(%rbp),%edx
mov    0x2d9a(%rip),%rax
and    (%rax),%edx
lea    0xf91(%rip),%rax
lea    0xfbc(%rip),%rcx
cmp    $0x0,%edx
cmovne %rcx,%rax
mov    %rax,-0x58(%rbp)
movl   $0x0,-0x5c(%rbp)
movq   $0x0,-0x70(%rbp)
movq   $0x0,-0x78(%rbp)
mov    -0x1c(%rbp),%eax
mov    0x2d7e(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1286 <do_wordexp+0x86>
mov    -0x18(%rbp),%rdi
call   1100 <wordfree@plt>
mov    -0x1c(%rbp),%eax
mov    0x2d48(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     144f <do_wordexp+0x24f>
movq   $0x0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     144a <do_wordexp+0x24a>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xfffffff6,%eax
mov    %eax,%ecx
mov    %rcx,-0x90(%rbp)
sub    $0x73,%eax
ja     1434 <do_wordexp+0x234>
mov    -0x90(%rbp),%rax
lea    0xd1c(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
cmpl   $0x0,-0x34(%rbp)
jne    1303 <do_wordexp+0x103>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1434 <do_wordexp+0x234>
cmpl   $0x0,-0x38(%rbp)
jne    131b <do_wordexp+0x11b>
mov    -0x34(%rbp),%eax
xor    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1434 <do_wordexp+0x234>
cmpl   $0x0,-0x34(%rbp)
jne    1333 <do_wordexp+0x133>
mov    -0x38(%rbp),%eax
xor    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1434 <do_wordexp+0x234>
cmpq   $0x0,-0x40(%rbp)
je     1354 <do_wordexp+0x154>
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1434 <do_wordexp+0x234>
jmp    1359 <do_wordexp+0x159>
cmpq   $0x0,-0x40(%rbp)
je     1375 <do_wordexp+0x175>
mov    -0x40(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x40(%rbp)
jmp    1434 <do_wordexp+0x234>
jmp    137a <do_wordexp+0x17a>
mov    -0x34(%rbp),%eax
or     -0x38(%rbp),%eax
cltq
or     -0x40(%rbp),%rax
cmp    $0x0,%rax
jne    13a1 <do_wordexp+0x1a1>
mov    0x2c21(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1823 <do_wordexp+0x623>
jmp    1434 <do_wordexp+0x234>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsbl 0x1(%rax,%rcx,1),%eax
cmp    $0x28,%eax
jne    13ef <do_wordexp+0x1ef>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsbl 0x2(%rax,%rcx,1),%eax
cmp    $0x28,%eax
jne    13ef <do_wordexp+0x1ef>
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x28(%rbp)
mov    -0x40(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x40(%rbp)
jmp    1434 <do_wordexp+0x234>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movsbl 0x1(%rax,%rcx,1),%eax
cmp    $0x28,%eax
je     140a <do_wordexp+0x20a>
jmp    1434 <do_wordexp+0x234>
jmp    140f <do_wordexp+0x20f>
jmp    1414 <do_wordexp+0x214>
cmpl   $0x0,-0x34(%rbp)
je     1423 <do_wordexp+0x223>
jmp    1434 <do_wordexp+0x234>
mov    0x2b86(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1823 <do_wordexp+0x623>
jmp    1439 <do_wordexp+0x239>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    12a3 <do_wordexp+0xa3>
jmp    144f <do_wordexp+0x24f>
mov    -0x1c(%rbp),%eax
mov    0x2b87(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     147b <do_wordexp+0x27b>
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x70(%rbp)
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x78(%rbp)
mov    -0x70(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
mov    0x2b13(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     14e1 <do_wordexp+0x2e1>
mov    -0x18(%rbp),%rax
movslq 0x10(%rax),%rax
mov    0x2ae1(%rip),%rcx
movslq (%rcx),%rcx
shr    $0x3,%rcx
shr    $0x2,%rcx
cmp    %rcx,%rax
jbe    14cc <do_wordexp+0x2cc>
mov    0x2afe(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1823 <do_wordexp+0x623>
mov    -0x18(%rbp),%rax
movslq 0x10(%rax),%rax
add    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
jmp    14ec <do_wordexp+0x2ec>
mov    -0x18(%rbp),%rax
movl   $0x0,0x10(%rax)
lea    -0x80(%rbp),%rdi
call   1080 <pipe@plt>
cmp    $0x0,%rax
jge    1510 <do_wordexp+0x310>
mov    0x2aba(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1823 <do_wordexp+0x623>
mov    $0x0,%al
call   1120 <fork@plt>
mov    %rax,-0x88(%rbp)
cmpq   $0x0,-0x88(%rbp)
jge    154d <do_wordexp+0x34d>
mov    -0x80(%rbp),%edi
call   1070 <close@plt>
mov    -0x7c(%rbp),%edi
call   1070 <close@plt>
mov    0x2a7d(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1823 <do_wordexp+0x623>
cmpq   $0x0,-0x88(%rbp)
jne    15bd <do_wordexp+0x3bd>
mov    -0x7c(%rbp),%edi
mov    $0x1,%esi
call   1060 <dup2@plt>
mov    -0x80(%rbp),%edi
call   1070 <close@plt>
mov    -0x7c(%rbp),%edi
call   1070 <close@plt>
mov    -0x10(%rbp),%r9
mov    -0x58(%rbp),%rax
lea    0xc55(%rip),%rdi
lea    0xc53(%rip),%r8
lea    0xc4f(%rip),%rdx
lea    0xc4b(%rip),%rcx
xor    %esi,%esi
mov    %r8,%rsi
mov    %rax,(%rsp)
movq   $0x0,0x8(%rsp)
call   1110 <execl@plt>
mov    $0x1,%edi
call   1040 <_exit@plt>
mov    -0x7c(%rbp),%edi
call   1070 <close@plt>
mov    -0x80(%rbp),%edi
lea    0xc34(%rip),%rsi
call   10d0 <fdopen@plt>
mov    %rax,-0x68(%rbp)
cmpq   $0x0,-0x68(%rbp)
jne    1623 <do_wordexp+0x423>
mov    -0x80(%rbp),%edi
call   1070 <close@plt>
mov    -0x88(%rbp),%rdi
mov    0x299f(%rip),%rax
mov    (%rax),%esi
call   10b0 <kill@plt>
mov    -0x88(%rbp),%rdi
lea    -0x60(%rbp),%rsi
xor    %edx,%edx
call   10f0 <waitpid@plt>
mov    0x29a7(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1823 <do_wordexp+0x623>
cmpq   $0x0,-0x78(%rbp)
je     1642 <do_wordexp+0x442>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    1650 <do_wordexp+0x450>
xor    %eax,%eax
mov    %rax,-0x98(%rbp)
jmp    1650 <do_wordexp+0x450>
mov    -0x98(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x68(%rbp),%rdi
call   1090 <getword@plt>
mov    %rax,-0x48(%rbp)
cmp    $0x0,%rax
je     16f5 <do_wordexp+0x4f5>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
cmp    -0x30(%rbp),%rax
jb     16c5 <do_wordexp+0x4c5>
mov    -0x30(%rbp),%rax
shr    $0x1,%rax
add    $0xa,%rax
add    -0x30(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x78(%rbp),%rdi
mov    -0x30(%rbp),%rsi
shl    $0x3,%rsi
call   10c0 <realloc@plt>
mov    %rax,-0x50(%rbp)
cmpq   $0x0,-0x50(%rbp)
jne    16bd <do_wordexp+0x4bd>
jmp    16f5 <do_wordexp+0x4f5>
mov    -0x50(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x48(%rbp),%rdx
mov    -0x78(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x28(%rbp)
mov    %rdx,(%rax,%rcx,8)
mov    -0x78(%rbp),%rax
mov    -0x28(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
jmp    165b <do_wordexp+0x45b>
mov    -0x68(%rbp),%rdi
call   10a0 <feof@plt>
cmp    $0x0,%eax
jne    1713 <do_wordexp+0x513>
mov    0x28b2(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x68(%rbp),%rdi
call   1050 <fclose@plt>
mov    -0x88(%rbp),%rdi
lea    -0x60(%rbp),%rsi
xor    %edx,%edx
call   10f0 <waitpid@plt>
mov    -0x60(%rbp),%edi
call   10e0 <WEXITSTATUS@plt>
cmp    $0x0,%rax
je     179c <do_wordexp+0x59c>
mov    -0x1c(%rbp),%eax
mov    0x2896(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
jne    176f <do_wordexp+0x56f>
mov    -0x78(%rbp),%rdi
call   1030 <free@plt>
mov    0x2863(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1823 <do_wordexp+0x623>
mov    -0x78(%rbp),%rax
mov    -0x18(%rbp),%rcx
cmp    0x8(%rcx),%rax
jne    1792 <do_wordexp+0x592>
mov    0x2840(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1823 <do_wordexp+0x623>
jmp    1797 <do_wordexp+0x597>
jmp    179c <do_wordexp+0x59c>
mov    -0x78(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,0x8(%rax)
mov    -0x28(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
movslq 0x10(%rax),%rax
mov    %rax,-0x28(%rbp)
cmpq   $0x0,-0x28(%rbp)
je     17f3 <do_wordexp+0x5f3>
mov    -0x18(%rbp),%rax
mov    0x8(%rax),%rax
mov    -0x28(%rbp),%rcx
sub    $0x1,%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
jmp    17bf <do_wordexp+0x5bf>
mov    -0x1c(%rbp),%eax
mov    0x27a3(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     181d <do_wordexp+0x61d>
mov    -0x18(%rbp),%rax
movslq 0x10(%rax),%rdx
mov    -0x18(%rbp),%rax
mov    (%rax),%rcx
sub    %rdx,%rcx
mov    %rcx,(%rax)
mov    -0x5c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<do_wordexp>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %rsi,%r13
mov    %rdi,%r14
mov    0x2db5(%rip),%rax
mov    (%rax),%r12d
mov    0x2dcb(%rip),%rax
mov    %edx,0xc(%rsp)
test   %edx,(%rax)
je     1235 <do_wordexp+0x35>
mov    %r13,%rdi
call   1100 <wordfree@plt>
mov    0x2d9c(%rip),%rax
mov    0xc(%rsp),%ecx
test   %ecx,(%rax)
je     12fa <do_wordexp+0xfa>
mov    (%r14),%bl
test   %bl,%bl
je     12fa <do_wordexp+0xfa>
xor    %eax,%eax
lea    0xda4(%rip),%rcx
xor    %ebp,%ebp
xor    %esi,%esi
xor    %edi,%edi
jmp    128e <do_wordexp+0x8e>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %ebp,%edx
or     %esi,%edx
movslq %edx,%rdx
or     %rdi,%rdx
je     1463 <do_wordexp+0x263>
movzbl 0x1(%r14,%rax,1),%ebx
add    $0x1,%rax
test   %bl,%bl
je     12fa <do_wordexp+0xfa>
movsbl %bl,%ebx
add    $0xfffffff6,%ebx
cmp    $0x73,%ebx
ja     1280 <do_wordexp+0x80>
movslq (%rcx,%rbx,4),%rbx
add    %rcx,%rbx
jmp    *%rbx
xor    %ebx,%ebx
test   %ebp,%ebp
sete   %bl
xor    %ebx,%esi
jmp    1280 <do_wordexp+0x80>
cmpb   $0x28,0x1(%rax,%r14,1)
jne    1280 <do_wordexp+0x80>
cmpb   $0x28,0x2(%r14,%rax,1)
jne    12c7 <do_wordexp+0xc7>
add    $0x2,%rax
add    $0x2,%rdi
jmp    1280 <do_wordexp+0x80>
test   %ebp,%ebp
jne    1280 <do_wordexp+0x80>
jmp    15e4 <do_wordexp+0x3e4>
xor    %ebx,%ebx
test   %esi,%esi
sete   %bl
xor    %ebx,%ebp
jmp    1280 <do_wordexp+0x80>
test   %rdi,%rdi
je     1270 <do_wordexp+0x70>
add    $0x1,%rdi
jmp    1280 <do_wordexp+0x80>
test   %rdi,%rdi
je     1270 <do_wordexp+0x70>
add    $0xffffffffffffffff,%rdi
jmp    1280 <do_wordexp+0x80>
cmp    $0x1,%ebp
adc    $0x0,%rax
jmp    1280 <do_wordexp+0x80>
mov    %r12d,%ebx
mov    0x2cdc(%rip),%rax
mov    0xc(%rsp),%ecx
test   %ecx,(%rax)
je     1316 <do_wordexp+0x116>
mov    0x0(%r13),%r12
mov    0x8(%r13),%rdx
jmp    131b <do_wordexp+0x11b>
xor    %r12d,%r12d
xor    %edx,%edx
mov    0x2c7e(%rip),%rax
mov    0xc(%rsp),%ecx
test   %ecx,(%rax)
je     134f <do_wordexp+0x14f>
movslq 0x10(%r13),%rax
mov    0x2c53(%rip),%rcx
movslq (%rcx),%rcx
shr    $0x5,%rcx
cmp    %rax,%rcx
jb     1495 <do_wordexp+0x295>
mov    %rdx,0x18(%rsp)
add    %rax,%r12
jmp    135c <do_wordexp+0x15c>
mov    %rdx,0x18(%rsp)
movl   $0x0,0x10(%r13)
lea    0x10(%rsp),%rdi
call   1080 <pipe@plt>
test   %rax,%rax
js     1495 <do_wordexp+0x295>
xor    %eax,%eax
call   1120 <fork@plt>
test   %rax,%rax
js     144f <do_wordexp+0x24f>
je     15f0 <do_wordexp+0x3f0>
mov    %rax,%rbp
mov    0x14(%rsp),%edi
call   1070 <close@plt>
mov    0x10(%rsp),%edi
lea    0xe67(%rip),%rsi
call   10d0 <fdopen@plt>
test   %rax,%rax
je     146c <do_wordexp+0x26c>
mov    %rax,%rbx
mov    %rbp,0x30(%rsp)
mov    %rax,%rdi
call   1090 <getword@plt>
test   %rax,%rax
mov    %rbx,0x28(%rsp)
je     14af <do_wordexp+0x2af>
mov    %rax,%rbp
lea    0x1(%r12),%rdx
mov    0x18(%rsp),%rax
test   %rax,%rax
cmove  %rax,%rdx
jmp    1413 <do_wordexp+0x213>
xchg   %ax,%ax
mov    %rdx,%r15
mov    0x18(%rsp),%rax
mov    %rbp,(%rax,%r12,8)
mov    %rax,0x18(%rsp)
movq   $0x0,(%rax,%r14,8)
mov    %rbx,%rdi
call   1090 <getword@plt>
mov    %rax,%rbp
mov    %r14,%r12
test   %rax,%rax
mov    %r15,%rdx
je     14bc <do_wordexp+0x2bc>
lea    0x1(%r12),%r14
cmp    %rdx,%r14
jb     13e0 <do_wordexp+0x1e0>
mov    %rdx,%r15
shr    %r15
lea    (%rdx,%r15,1),%rax
lea    0x50(,%rax,8),%rsi
mov    0x18(%rsp),%rdi
mov    %rdx,%rbx
call   10c0 <realloc@plt>
test   %rax,%rax
je     14b4 <do_wordexp+0x2b4>
add    %rbx,%r15
add    $0xa,%r15
mov    0x28(%rsp),%rbx
jmp    13e8 <do_wordexp+0x1e8>
mov    0x10(%rsp),%edi
call   1070 <close@plt>
mov    0x14(%rsp),%edi
call   1070 <close@plt>
jmp    1495 <do_wordexp+0x295>
mov    0x2b4e(%rip),%rax
jmp    149c <do_wordexp+0x29c>
mov    0x10(%rsp),%edi
call   1070 <close@plt>
mov    0x2b1c(%rip),%rax
mov    (%rax),%esi
mov    %rbp,%rdi
call   10b0 <kill@plt>
lea    0x24(%rsp),%rsi
mov    %rbp,%rdi
xor    %edx,%edx
call   10f0 <waitpid@plt>
mov    0x2b24(%rip),%rax
mov    (%rax),%ebx
mov    %ebx,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r12,%r14
jmp    14bc <do_wordexp+0x2bc>
mov    %r12,%r14
mov    0x28(%rsp),%rbx
mov    %rbx,%rdi
call   10a0 <feof@plt>
mov    $0x0,%ebx
test   %eax,%eax
jne    14d6 <do_wordexp+0x2d6>
mov    0x2aec(%rip),%rax
mov    (%rax),%ebx
mov    0x28(%rsp),%rdi
call   1050 <fclose@plt>
lea    0x24(%rsp),%rsi
mov    0x30(%rsp),%rdi
xor    %edx,%edx
call   10f0 <waitpid@plt>
mov    0x24(%rsp),%edi
call   10e0 <WEXITSTATUS@plt>
test   %rax,%rax
mov    0x2a9c(%rip),%rbp
mov    0x18(%rsp),%rdi
je     1528 <do_wordexp+0x328>
mov    0x2ace(%rip),%rax
mov    0xc(%rsp),%ecx
test   %ecx,(%rax)
je     15d3 <do_wordexp+0x3d3>
cmp    0x8(%r13),%rdi
je     15d8 <do_wordexp+0x3d8>
mov    %rdi,0x8(%r13)
mov    %r14,0x0(%r13)
movslq 0x10(%r13),%rax
test   %rax,%rax
je     15ba <do_wordexp+0x3ba>
mov    %rax,%rcx
movq   $0x0,-0x8(%rdi,%rax,8)
add    $0xffffffffffffffff,%rcx
je     15ba <do_wordexp+0x3ba>
lea    -0x2(%rax),%rdx
mov    %rcx,%rsi
and    $0x3,%rsi
je     1577 <do_wordexp+0x377>
nopl   0x0(%rax)
mov    0x8(%r13),%rdi
movq   $0x0,-0x8(%rdi,%rcx,8)
add    $0xffffffffffffffff,%rcx
add    $0xffffffffffffffff,%rsi
jne    1560 <do_wordexp+0x360>
cmp    $0x3,%rdx
jb     15ba <do_wordexp+0x3ba>
nopl   (%rax)
mov    0x8(%r13),%rdx
movq   $0x0,-0x8(%rdx,%rcx,8)
mov    0x8(%r13),%rdx
movq   $0x0,-0x10(%rdx,%rcx,8)
mov    0x8(%r13),%rdx
movq   $0x0,-0x18(%rdx,%rcx,8)
mov    0x8(%r13),%rdx
movq   $0x0,-0x20(%rdx,%rcx,8)
add    $0xfffffffffffffffc,%rcx
jne    1580 <do_wordexp+0x380>
mov    0xc(%rsp),%ecx
test   %ecx,0x0(%rbp)
je     149e <do_wordexp+0x29e>
sub    %rax,%r14
mov    %r14,0x0(%r13)
jmp    149e <do_wordexp+0x29e>
call   1030 <free@plt>
mov    0x29e9(%rip),%rax
jmp    149c <do_wordexp+0x29c>
mov    0x29c5(%rip),%rax
jmp    149c <do_wordexp+0x29c>
test   %ebx,0xc(%rsp)
lea    0xbd5(%rip),%rax
lea    0xc00(%rip),%rbx
cmove  %rax,%rbx
mov    0x14(%rsp),%edi
mov    $0x1,%esi
call   1060 <dup2@plt>
mov    0x10(%rsp),%edi
call   1070 <close@plt>
mov    0x14(%rsp),%edi
call   1070 <close@plt>
lea    0xbaf(%rip),%rdi
lea    0xbb0(%rip),%rdx
lea    0xbac(%rip),%rcx
lea    0xb9f(%rip),%rsi
mov    %rsi,%r8
mov    %r14,%r9
push   $0x0
push   %rbx
call   1110 <execl@plt>
add    $0x10,%rsp
mov    $0x1,%edi
call   1040 <_exit@plt>

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

LLVM IR (-O2):
%struct.TYPE_4__ = type { i64, i8**, i32 }
@WRDE_SHOWERR = global i32 0
@.str = [1 x i8] zeroinitializer
@.str.1 = [12 x i8] c"2>/dev/null\00"
@WRDE_REUSE = global i32 0
@WRDE_NOCMD = global i32 0
@WRDE_BADCHAR = global i32 0
@WRDE_CMDSUB = global i32 0
@WRDE_APPEND = global i32 0
@WRDE_DOOFFS = global i32 0
@SIZE_MAX = global i32 0
@WRDE_NOSPACE = global i32 0
@.str.2 = [8 x i8] c"/bin/sh\00"
@.str.3 = [3 x i8] c"sh\00"
@.str.4 = [3 x i8] c"-c\00"
@.str.5 = [28 x i8] c"eval \22printf %s\\\\\\\\0 $1 $2\22\00"
@.str.6 = [2 x i8] c"r\00"
@SIGKILL = global i32 0
@WRDE_SYNTAX = global i32 0
define i32 @do_wordexp(i8* %0, %struct.TYPE_4__* %1, i32 %2) {
%4 = alloca i32
%5 = alloca [2 x i32]
%6 = load i32, i32* @WRDE_SHOWERR
%7 = bitcast i32* %4 to i8*
%8 = bitcast [2 x i32]* %5 to i8*
%9 = load i32, i32* @WRDE_REUSE
%10 = and i32 %9, %2
%11 = icmp eq i32 %10, 0
br i1 %11, label %14, label %12
12: ; preds = %3
%13 = tail call i32 @wordfree(%struct.TYPE_4__* %1)
br label %14
14: ; preds = %12, %3
%15 = load i32, i32* @WRDE_NOCMD
%16 = and i32 %15, %2
%17 = icmp eq i32 %16, 0
br i1 %17, label %82, label %18
18: ; preds = %14
%19 = load i8, i8* %0
%20 = icmp eq i8 %19, 0
br i1 %20, label %82, label %21
21: ; preds = %18, %73
%22 = phi i8 [ %80, %73 ], [ %19, %18 ]
%23 = phi i64 [ %78, %73 ], [ 0, %18 ]
%24 = phi i32 [ %76, %73 ], [ 0, %18 ]
%25 = phi i32 [ %75, %73 ], [ 0, %18 ]
%26 = phi i64 [ %74, %73 ], [ 0, %18 ]
%27 = sext i8 %22 to i32
switch i32 %27, label %73 [
i32 92, label %28
i32 39, label %32
i32 34, label %36
i32 40, label %40
i32 41, label %44
i32 10, label %48
i32 124, label %48
i32 38, label %48
i32 59, label %48
i32 60, label %48
i32 62, label %48
i32 123, label %48
i32 125, label %48
i32 36, label %55
i32 96, label %69
]
28: ; preds = %21
%29 = icmp eq i32 %24, 0
%30 = zext i1 %29 to i64
%31 = add i64 %23, %30
br label %73
32: ; preds = %21
%33 = icmp eq i32 %25, 0
%34 = zext i1 %33 to i32
%35 = xor i32 %24, %34
br label %73
36: ; preds = %21
%37 = icmp eq i32 %24, 0
%38 = zext i1 %37 to i32
%39 = xor i32 %25, %38
br label %73
40: ; preds = %21
%41 = icmp eq i64 %26, 0
br i1 %41, label %48, label %42
42: ; preds = %40
%43 = add i64 %26, 1
br label %73
44: ; preds = %21
%45 = icmp eq i64 %26, 0
br i1 %45, label %48, label %46
46: ; preds = %44
%47 = add i64 %26, -1
br label %73
48: ; preds = %40, %44, %21, %21, %21, %21, %21, %21, %21, %21
%49 = or i32 %24, %25
%50 = sext i32 %49 to i64
%51 = or i64 %26, %50
%52 = icmp eq i64 %51, 0
br i1 %52, label %53, label %73
53: ; preds = %48
%54 = load i32, i32* @WRDE_BADCHAR
br label %256
55: ; preds = %21
%56 = add i64 %23, 1
%57 = getelementptr inbounds i8, i8* %0, i64 %56
%58 = load i8, i8* %57
%59 = icmp eq i8 %58, 40
br i1 %59, label %60, label %73
60: ; preds = %55
%61 = add i64 %23, 2
%62 = getelementptr inbounds i8, i8* %0, i64 %61
%63 = load i8, i8* %62
%64 = icmp eq i8 %63, 40
br i1 %64, label %65, label %67
65: ; preds = %60
%66 = add i64 %26, 2
br label %73
67: ; preds = %60
%68 = icmp eq i32 %24, 0
br i1 %68, label %71, label %73
69: ; preds = %21
%70 = icmp eq i32 %24, 0
br i1 %70, label %71, label %73
71: ; preds = %67, %69
%72 = load i32, i32* @WRDE_CMDSUB
br label %256
73: ; preds = %55, %36, %32, %28, %42, %46, %65, %21, %48, %67, %69
%74 = phi i64 [ %26, %21 ], [ %26, %69 ], [ %66, %65 ], [ %26, %67 ], [ %26, %48 ], [ %47, %46 ], [ %43, %42 ], [ %26, %28 ], [ %26, %32 ], [ %26, %36 ], [ %26, %55 ]
%75 = phi i32 [ %25, %21 ], [ %25, %69 ], [ %25, %65 ], [ %25, %67 ], [ %25, %48 ], [ %25, %46 ], [ %25, %42 ], [ %25, %28 ], [ %25, %32 ], [ %39, %36 ], [ %25, %55 ]
%76 = phi i32 [ %24, %21 ], [ %24, %69 ], [ %24, %65 ], [ %24, %67 ], [ %24, %48 ], [ %24, %46 ], [ %24, %42 ], [ %24, %28 ], [ %35, %32 ], [ %24, %36 ], [ %24, %55 ]
%77 = phi i64 [ %23, %21 ], [ %23, %69 ], [ %61, %65 ], [ %23, %67 ], [ %23, %48 ], [ %23, %46 ], [ %23, %42 ], [ %31, %28 ], [ %23, %32 ], [ %23, %36 ], [ %23, %55 ]
%78 = add i64 %77, 1
%79 = getelementptr inbounds i8, i8* %0, i64 %78
%80 = load i8, i8* %79
%81 = icmp eq i8 %80, 0
br i1 %81, label %82, label %21
82: ; preds = %73, %18, %14
%83 = load i32, i32* @WRDE_APPEND
%84 = and i32 %83, %2
%85 = icmp eq i32 %84, 0
br i1 %85, label %91, label %86
86: ; preds = %82
%87 = getelementptr inbounds %struct.TYPE_4__, %struct.TYPE_4__* %1, i64 0, i32 0
%88 = load i64, i64* %87
%89 = getelementptr inbounds %struct.TYPE_4__, %struct.TYPE_4__* %1, i64 0, i32 1
%90 = load i8**, i8*** %89
br label %91
91: ; preds = %86, %82
%92 = phi i64 [ %88, %86 ], [ 0, %82 ]
%93 = phi i8** [ %90, %86 ], [ null, %82 ]
%94 = load i32, i32* @WRDE_DOOFFS
%95 = and i32 %94, %2
%96 = icmp eq i32 %95, 0
%97 = getelementptr inbounds %struct.TYPE_4__, %struct.TYPE_4__* %1, i64 0, i32 2
br i1 %96, label %109, label %98
98: ; preds = %91
%99 = load i32, i32* %97
%100 = sext i32 %99 to i64
%101 = load i32, i32* @SIZE_MAX
%102 = sext i32 %101 to i64
%103 = lshr i64 %102, 5
%104 = icmp ult i64 %103, %100
br i1 %104, label %105, label %107
105: ; preds = %98
%106 = load i32, i32* @WRDE_NOSPACE
br label %256
107: ; preds = %98
%108 = add i64 %92, %100
br label %110
109: ; preds = %91
store i32 0, i32* %97
br label %110
110: ; preds = %109, %107
%111 = phi i64 [ %108, %107 ], [ %92, %109 ]
%112 = getelementptr inbounds [2 x i32], [2 x i32]* %5, i64 0, i64 0
%113 = call i64 @pipe(i32* %112)
%114 = icmp slt i64 %113, 0
br i1 %114, label %115, label %117
115: ; preds = %110
%116 = load i32, i32* @WRDE_NOSPACE
br label %256
117: ; preds = %110
%118 = call i64 (...) @fork()
%119 = icmp slt i64 %118, 0
br i1 %119, label %120, label %127
120: ; preds = %117
%121 = load i32, i32* %112
%122 = call i32 @close(i32 %121)
%123 = getelementptr inbounds [2 x i32], [2 x i32]* %5, i64 0, i64 1
%124 = load i32, i32* %123
%125 = call i32 @close(i32 %124)
%126 = load i32, i32* @WRDE_NOSPACE
br label %256
127: ; preds = %117
%128 = icmp eq i64 %118, 0
br i1 %128, label %129, label %142
129: ; preds = %127
%130 = and i32 %6, %2
%131 = icmp eq i32 %130, 0
%132 = select i1 %131, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0)
%133 = getelementptr inbounds [2 x i32], [2 x i32]* %5, i64 0, i64 1
%134 = load i32, i32* %133
%135 = call i32 @dup2(i32 %134, i32 1)
%136 = load i32, i32* %112
%137 = call i32 @close(i32 %136)
%138 = load i32, i32* %133
%139 = call i32 @close(i32 %138)
%140 = call i32 @execl(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i64 0, i64 0), i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i64 0, i64 0), i8* %0, i8* %132, i8* null)
%141 = call i32 @_exit(i32 1)
unreachable
142: ; preds = %127
%143 = getelementptr inbounds [2 x i32], [2 x i32]* %5, i64 0, i64 1
%144 = load i32, i32* %143
%145 = call i32 @close(i32 %144)
%146 = load i32, i32* %112
%147 = call i32* @fdopen(i32 %146, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i64 0, i64 0))
%148 = icmp eq i32* %147, null
br i1 %148, label %149, label %156
149: ; preds = %142
%150 = load i32, i32* %112
%151 = call i32 @close(i32 %150)
%152 = load i32, i32* @SIGKILL
%153 = call i32 @kill(i64 %118, i32 %152)
%154 = call i32 @waitpid(i64 %118, i32* %4, i32 0)
%155 = load i32, i32* @WRDE_NOSPACE
br label %256
156: ; preds = %142
%157 = call i8* @getword(i32* %147)
%158 = icmp eq i8* %157, null
br i1 %158, label %184, label %159
159: ; preds = %156
%160 = icmp eq i8** %93, null
%161 = add i64 %111, 1
%162 = select i1 %160, i64 0, i64 %161
br label %163
163: ; preds = %159, %177
%164 = phi i8* [ %182, %177 ], [ %157, %159 ]
%165 = phi i8** [ %179, %177 ], [ %93, %159 ]
%166 = phi i64 [ %168, %177 ], [ %111, %159 ]
%167 = phi i64 [ %178, %177 ], [ %162, %159 ]
%168 = add i64 %166, 1
%169 = icmp ult i64 %168, %167
br i1 %169, label %177, label %170
170: ; preds = %163
%171 = lshr i64 %167, 1
%172 = add i64 %167, 10
%173 = add i64 %172, %171
%174 = shl i64 %173, 3
%175 = call i8** @realloc(i8** %165, i64 %174)
%176 = icmp eq i8** %175, null
br i1 %176, label %184, label %177
177: ; preds = %170, %163
%178 = phi i64 [ %167, %163 ], [ %173, %170 ]
%179 = phi i8** [ %165, %163 ], [ %175, %170 ]
%180 = getelementptr inbounds i8*, i8** %179, i64 %166
store i8* %164, i8** %180
%181 = getelementptr inbounds i8*, i8** %179, i64 %168
store i8* null, i8** %181
%182 = call i8* @getword(i32* %147)
%183 = icmp eq i8* %182, null
br i1 %183, label %184, label %163
184: ; preds = %177, %170, %156
%185 = phi i64 [ %111, %156 ], [ %166, %170 ], [ %168, %177 ]
%186 = phi i8** [ %93, %156 ], [ %165, %170 ], [ %179, %177 ]
%187 = call i32 @feof(i32* %147)
%188 = icmp eq i32 %187, 0
%189 = load i32, i32* @WRDE_NOSPACE
%190 = select i1 %188, i32 %189, i32 0
%191 = call i32 @fclose(i32* %147)
%192 = call i32 @waitpid(i64 %118, i32* %4, i32 0)
%193 = load i32, i32* %4
%194 = call i64 @WEXITSTATUS(i32 %193)
%195 = icmp eq i64 %194, 0
br i1 %195, label %209, label %196
196: ; preds = %184
%197 = load i32, i32* @WRDE_APPEND
%198 = and i32 %197, %2
%199 = icmp eq i32 %198, 0
br i1 %199, label %200, label %203
200: ; preds = %196
%201 = call i32 @free(i8** %186)
%202 = load i32, i32* @WRDE_SYNTAX
br label %256
203: ; preds = %196
%204 = getelementptr inbounds %struct.TYPE_4__, %struct.TYPE_4__* %1, i64 0, i32 1
%205 = load i8**, i8*** %204
%206 = icmp eq i8** %186, %205
br i1 %206, label %207, label %209
207: ; preds = %203
%208 = load i32, i32* @WRDE_SYNTAX
br label %256
209: ; preds = %203, %184
%210 = getelementptr inbounds %struct.TYPE_4__, %struct.TYPE_4__* %1, i64 0, i32 1
store i8** %186, i8*** %210
%211 = getelementptr inbounds %struct.TYPE_4__, %struct.TYPE_4__* %1, i64 0, i32 0
store i64 %185, i64* %211
%212 = getelementptr inbounds %struct.TYPE_4__, %struct.TYPE_4__* %1, i64 0, i32 2
%213 = load i32, i32* %212
%214 = sext i32 %213 to i64
%215 = icmp eq i32 %213, 0
br i1 %215, label %250, label %216
216: ; preds = %209
%217 = add nsw i64 %214, -1
%218 = getelementptr inbounds i8*, i8** %186, i64 %217
store i8* null, i8** %218
%219 = icmp eq i64 %217, 0
br i1 %219, label %250, label %220
220: ; preds = %216
%221 = add nsw i64 %214, -2
%222 = and i64 %217, 3
%223 = icmp eq i64 %222, 0
br i1 %223, label %232, label %224
224: ; preds = %220, %224
%225 = phi i64 [ %228, %224 ], [ %217, %220 ]
%226 = phi i64 [ %230, %224 ], [ 0, %220 ]
%227 = load i8**, i8*** %210
%228 = add i64 %225, -1
%229 = getelementptr inbounds i8*, i8** %227, i64 %228
store i8* null, i8** %229
%230 = add i64 %226, 1
%231 = icmp eq i64 %230, %222
br i1 %231, label %232, label %224
232: ; preds = %224, %220
%233 = phi i64 [ %217, %220 ], [ %228, %224 ]
%234 = icmp ult i64 %221, 3
br i1 %234, label %250, label %235
235: ; preds = %232, %235
%236 = phi i64 [ %247, %235 ], [ %233, %232 ]
%237 = load i8**, i8*** %210
%238 = add i64 %236, -1
%239 = getelementptr inbounds i8*, i8** %237, i64 %238
store i8* null, i8** %239
%240 = load i8**, i8*** %210
%241 = add i64 %236, -2
%242 = getelementptr inbounds i8*, i8** %240, i64 %241
store i8* null, i8** %242
%243 = load i8**, i8*** %210
%244 = add i64 %236, -3
%245 = getelementptr inbounds i8*, i8** %243, i64 %244
store i8* null, i8** %245
%246 = load i8**, i8*** %210
%247 = add i64 %236, -4
%248 = getelementptr inbounds i8*, i8** %246, i64 %247
store i8* null, i8** %248
%249 = icmp eq i64 %247, 0
br i1 %249, label %250, label %235
250: ; preds = %232, %235, %216, %209
%251 = load i32, i32* @WRDE_DOOFFS
%252 = and i32 %251, %2
%253 = icmp eq i32 %252, 0
br i1 %253, label %256, label %254
254: ; preds = %250
%255 = sub i64 %185, %214
store i64 %255, i64* %211
br label %256
256: ; preds = %250, %254, %207, %200, %149, %120, %115, %105, %71, %53
%257 = phi i32 [ %72, %71 ], [ %54, %53 ], [ %106, %105 ], [ %116, %115 ], [ %126, %120 ], [ %208, %207 ], [ %202, %200 ], [ %155, %149 ], [ %190, %254 ], [ %190, %250 ]
ret i32 %257
}