#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 */
typedef char u_char;

/* Variables and functions */
int /*<<< orphan*/ isdigit(int);
int /*<<< orphan*/ tolower(int);
int unvis(char *cp, int c, int *astate, int flag) {
  if (flag & 1) {
    if (*astate == 5 || *astate == 6) {
      *astate = 0;
      return (1);
    }
    return (*astate == 0 ? 3 : -1);
  }
  switch (*astate & ~0x080) {
  case 0:
    *cp = 0;
    if (c == '\\') {
      *astate = 1;
      return (0);
    }
    if (flag & 0x80 && c == '%') {
      *astate = 1 | 0x080;
      return (0);
    }
    *cp = c;
    return (1);
  case 1:
    if (*astate & 0x080) {
      if (((((u_char)(tolower(c))) >= '0' && ((u_char)(tolower(c))) <= '9') ||
           (((u_char)(tolower(c))) >= 'a' && ((u_char)(tolower(c))) <= 'f'))) {
        *cp = isdigit(c) ? (c - '0') : (tolower(c) - 'a');
        *astate = 7;
        return (0);
      }
    }
    switch (c) {
    case '\\':
      *cp = c;
      *astate = 0;
      return (1);
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
      *cp = (c - '0');
      *astate = 5;
      return (0);
    case 'M':
      *cp = 0200;
      *astate = 2;
      return (0);
    case '^':
      *astate = 4;
      return (0);
    case 'n':
      *cp = '\n';
      *astate = 0;
      return (1);
    case 'r':
      *cp = '\r';
      *astate = 0;
      return (1);
    case 'b':
      *cp = '\b';
      *astate = 0;
      return (1);
    case 'a':
      *cp = '\007';
      *astate = 0;
      return (1);
    case 'v':
      *cp = '\v';
      *astate = 0;
      return (1);
    case 't':
      *cp = '\t';
      *astate = 0;
      return (1);
    case 'f':
      *cp = '\f';
      *astate = 0;
      return (1);
    case 's':
      *cp = ' ';
      *astate = 0;
      return (1);
    case 'E':
      *cp = '\033';
      *astate = 0;
      return (1);
    case '\n':
      *astate = 0;
      return (3);
    case '$':
      *astate = 0;
      return (3);
    }
    *astate = 0;
    return (-1);
  case 2:
    if (c == '-')
      *astate = 3;
    else if (c == '^')
      *astate = 4;
    else {
      *astate = 0;
      return (-1);
    }
    return (0);
  case 3:
    *astate = 0;
    *cp |= c;
    return (1);
  case 4:
    if (c == '?')
      *cp |= 0177;
    else
      *cp |= c & 037;
    *astate = 0;
    return (1);
  case 5:
    if ((((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')) {
      *cp = (*cp << 3) + (c - '0');
      *astate = 6;
      return (0);
    }
    *astate = 0;
    return (2);
  case 6:
    *astate = 0;
    if ((((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')) {
      *cp = (*cp << 3) + (c - '0');
      return (1);
    }
    return (2);
  case 7:
    if (((((u_char)(tolower(c))) >= '0' && ((u_char)(tolower(c))) <= '9') ||
         (((u_char)(tolower(c))) >= 'a' && ((u_char)(tolower(c))) <= 'f'))) {
      *cp = (isdigit(c) ? (*cp << 4) + (c - '0')
                        : (*cp << 4) + (tolower(c) - 'a' + 10));
    }
    *astate = 0;
    return (1);
  default:
    *astate = 0;
    return (-1);
  }
}


x86 assembly (clang, -O0):
<unvis>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    -0x24(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1193 <unvis+0x73>
mov    -0x20(%rbp),%rax
cmpl   $0x5,(%rax)
je     115f <unvis+0x3f>
mov    -0x20(%rbp),%rax
cmpl   $0x6,(%rax)
jne    1175 <unvis+0x55>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
mov    (%rax),%edx
mov    $0xffffffff,%eax
mov    $0x3,%ecx
cmp    $0x0,%edx
cmove  %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0xffffff7f,%eax
mov    %rax,-0x30(%rbp)
sub    $0x7,%eax
ja     170b <unvis+0x5eb>
mov    -0x30(%rbp),%rax
lea    0xe4a(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
cmpl   $0x5c,-0x14(%rbp)
jne    11e6 <unvis+0xc6>
mov    -0x20(%rbp),%rax
movl   $0x1,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x24(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     1217 <unvis+0xf7>
cmpl   $0x25,-0x14(%rbp)
jne    1217 <unvis+0xf7>
mov    -0x20(%rbp),%rax
movl   $0x81,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x14(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
mov    (%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     12e5 <unvis+0x1c5>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
movsbl %al,%eax
cmp    $0x30,%eax
jl     126a <unvis+0x14a>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
movsbl %al,%eax
cmp    $0x39,%eax
jle    1292 <unvis+0x172>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
movsbl %al,%eax
cmp    $0x61,%eax
jl     12e0 <unvis+0x1c0>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
movsbl %al,%eax
cmp    $0x66,%eax
jg     12e0 <unvis+0x1c0>
mov    -0x14(%rbp),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     12b1 <unvis+0x191>
mov    -0x14(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x34(%rbp)
jmp    12bf <unvis+0x19f>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
sub    $0x61,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x7,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
jmp    12e5 <unvis+0x1c5>
mov    -0x14(%rbp),%eax
add    $0xfffffff6,%eax
mov    %eax,%ecx
mov    %rcx,-0x40(%rbp)
sub    $0x6c,%eax
ja     14b7 <unvis+0x397>
mov    -0x40(%rbp),%rax
lea    0xd1b(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x14(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x14(%rbp),%eax
sub    $0x30,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x5,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0x80,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x2,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
movl   $0x4,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0xa,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0xd,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0x8,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0x7,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0xb,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0x9,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0xc,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x10(%rbp),%rax
movb   $0x1b,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x3,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x3,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
cmpl   $0x2d,-0x14(%rbp)
jne    14e6 <unvis+0x3c6>
mov    -0x20(%rbp),%rax
movl   $0x3,(%rax)
jmp    151a <unvis+0x3fa>
cmpl   $0x5e,-0x14(%rbp)
jne    14ff <unvis+0x3df>
mov    -0x20(%rbp),%rax
movl   $0x4,(%rax)
jmp    1515 <unvis+0x3f5>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
jmp    151a <unvis+0x3fa>
movl   $0x0,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x14(%rbp),%edx
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
cmpl   $0x3f,-0x14(%rbp)
jne    1565 <unvis+0x445>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
or     $0x7f,%ecx
mov    %cl,(%rax)
jmp    1576 <unvis+0x456>
mov    -0x14(%rbp),%edx
and    $0x1f,%edx
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
or     %edx,%ecx
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x14(%rbp),%eax
movsbl %al,%eax
cmp    $0x30,%eax
jl     15da <unvis+0x4ba>
mov    -0x14(%rbp),%eax
movsbl %al,%eax
cmp    $0x37,%eax
jg     15da <unvis+0x4ba>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
shl    $0x3,%eax
mov    -0x14(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x6,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x2,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x14(%rbp),%eax
movsbl %al,%eax
cmp    $0x30,%eax
jl     163e <unvis+0x51e>
mov    -0x14(%rbp),%eax
movsbl %al,%eax
cmp    $0x37,%eax
jg     163e <unvis+0x51e>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
shl    $0x3,%eax
mov    -0x14(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
movl   $0x2,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
movsbl %al,%eax
cmp    $0x30,%eax
jl     1672 <unvis+0x552>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
movsbl %al,%eax
cmp    $0x39,%eax
jle    169a <unvis+0x57a>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
movsbl %al,%eax
cmp    $0x61,%eax
jl     16f5 <unvis+0x5d5>
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
movsbl %al,%eax
cmp    $0x66,%eax
jg     16f5 <unvis+0x5d5>
mov    -0x14(%rbp),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     16c5 <unvis+0x5a5>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
shl    $0x4,%eax
mov    -0x14(%rbp),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %eax,-0x44(%rbp)
jmp    16ea <unvis+0x5ca>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
shl    $0x4,%eax
mov    %eax,-0x48(%rbp)
mov    -0x14(%rbp),%edi
call   1040 <tolower@plt>
mov    %eax,%ecx
mov    -0x48(%rbp),%eax
sub    $0x61,%ecx
add    $0xa,%ecx
add    %ecx,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0x1,-0x4(%rbp)
jmp    171c <unvis+0x5fc>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<unvis>:
push   %r15
push   %r14
push   %rbx
mov    %rdx,%rbx
mov    (%rdx),%eax
test   $0x1,%cl
jne    115f <unvis+0x4f>
mov    %eax,%edx
and    $0xffffff7f,%edx
cmp    $0x7,%edx
ja     11fd <unvis+0xed>
mov    %esi,%r15d
mov    %rdi,%r14
lea    0xec3(%rip),%rsi
movslq (%rsi,%rdx,4),%rdx
add    %rsi,%rdx
jmp    *%rdx
movb   $0x0,(%r14)
cmp    $0x5c,%r15d
jne    12f3 <unvis+0x1e3>
movl   $0x1,(%rbx)
jmp    1339 <unvis+0x229>
lea    -0x5(%rax),%ecx
cmp    $0x1,%ecx
ja     1177 <unvis+0x67>
movl   $0x0,(%rbx)
mov    $0x1,%eax
jmp    133b <unvis+0x22b>
neg    %eax
sbb    %eax,%eax
or     $0x3,%eax
jmp    133b <unvis+0x22b>
test   $0x80,%al
je     11b8 <unvis+0xa8>
mov    %r15d,%edi
call   1030 <tolower@plt>
mov    %eax,%ecx
shl    $0x18,%ecx
lea    -0x2f000001(%rcx),%edx
cmp    $0xaffffff,%edx
jb     131f <unvis+0x20f>
add    $0x9fffffff,%ecx
cmp    $0x6fffffe,%ecx
jbe    131f <unvis+0x20f>
lea    -0xa(%r15),%eax
cmp    $0x6c,%eax
ja     11fd <unvis+0xed>
lea    0xe58(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
add    $0xd0,%r15b
mov    %r15b,(%r14)
movl   $0x5,(%rbx)
jmp    1339 <unvis+0x229>
cmp    $0x2d,%r15d
je     1316 <unvis+0x206>
cmp    $0x5e,%r15d
jne    11fd <unvis+0xed>
mov    $0x4,%eax
jmp    131b <unvis+0x20b>
movl   $0x0,(%rbx)
mov    $0xffffffff,%eax
jmp    133b <unvis+0x22b>
movl   $0x0,(%rbx)
or     %r15b,(%r14)
mov    $0x1,%eax
jmp    133b <unvis+0x22b>
mov    %r15d,%eax
and    $0x1f,%al
cmp    $0x3f,%r15d
movzbl %al,%eax
mov    $0x7f,%ecx
cmovne %eax,%ecx
or     %cl,(%r14)
jmp    1167 <unvis+0x57>
mov    %r15d,%eax
shl    $0x18,%eax
add    $0xd0ffffff,%eax
cmp    $0x8fffffe,%eax
ja     1309 <unvis+0x1f9>
movzbl (%r14),%eax
lea    (%r15,%rax,8),%eax
add    $0xd0,%al
mov    %al,(%r14)
movl   $0x6,(%rbx)
jmp    1339 <unvis+0x229>
movl   $0x0,(%rbx)
mov    %r15d,%ecx
shl    $0x18,%ecx
add    $0xd0ffffff,%ecx
mov    $0x2,%eax
cmp    $0x8fffffe,%ecx
ja     133b <unvis+0x22b>
movzbl (%r14),%eax
lea    (%r15,%rax,8),%eax
add    $0xd0,%al
mov    %al,(%r14)
mov    $0x1,%eax
jmp    133b <unvis+0x22b>
mov    %r15d,%edi
call   1030 <tolower@plt>
mov    %eax,%ecx
shl    $0x18,%ecx
lea    -0x2f000001(%rcx),%edx
cmp    $0xaffffff,%edx
jb     12d1 <unvis+0x1c1>
add    $0x9fffffff,%ecx
cmp    $0x6fffffe,%ecx
ja     1167 <unvis+0x57>
add    $0xffffffd0,%r15d
movzbl (%r14),%ecx
shl    $0x4,%ecx
add    $0xa9,%eax
cmp    $0xa,%r15d
cmovb  %r15d,%eax
add    %ecx,%eax
mov    %al,(%r14)
jmp    1167 <unvis+0x57>
cmp    $0x25,%r15d
jne    1341 <unvis+0x231>
and    $0x80,%ecx
je     1341 <unvis+0x231>
movl   $0x81,(%rbx)
jmp    1339 <unvis+0x229>
movl   $0x0,(%rbx)
mov    $0x2,%eax
jmp    133b <unvis+0x22b>
mov    $0x3,%eax
mov    %eax,(%rbx)
jmp    1339 <unvis+0x229>
add    $0xffffffd0,%r15d
add    $0x9f,%al
cmp    $0xa,%r15d
movzbl %al,%eax
cmovb  %r15d,%eax
mov    %al,(%r14)
movl   $0x7,(%rbx)
xor    %eax,%eax
pop    %rbx
pop    %r14
pop    %r15
ret
mov    %r15b,(%r14)
mov    $0x1,%eax
jmp    133b <unvis+0x22b>
movl   $0x0,(%rbx)
mov    $0x3,%eax
jmp    133b <unvis+0x22b>
movb   $0x1b,(%r14)
jmp    1167 <unvis+0x57>
movb   $0x80,(%r14)
movl   $0x2,(%rbx)
jmp    1339 <unvis+0x229>
movb   $0x5c,(%r14)
jmp    1167 <unvis+0x57>
movl   $0x4,(%rbx)
jmp    1339 <unvis+0x229>
movb   $0x7,(%r14)
jmp    1167 <unvis+0x57>
movb   $0x8,(%r14)
jmp    1167 <unvis+0x57>
movb   $0xc,(%r14)
jmp    1167 <unvis+0x57>
movb   $0xa,(%r14)
jmp    1167 <unvis+0x57>
movb   $0xd,(%r14)
jmp    1167 <unvis+0x57>
movb   $0x20,(%r14)
jmp    1167 <unvis+0x57>
movb   $0x9,(%r14)
jmp    1167 <unvis+0x57>
movb   $0xb,(%r14)
jmp    1167 <unvis+0x57>

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

LLVM IR (-O2):
define i32 @unvis(i8* %0, i32 %1, i32* %2, i32 %3) {
%5 = and i32 %3, 1
%6 = icmp eq i32 %5, 0
%7 = load i32, i32* %2
br i1 %6, label %15, label %8
8: ; preds = %4
%9 = add i32 %7, -5
%10 = icmp ult i32 %9, 2
br i1 %10, label %11, label %12
11: ; preds = %8
store i32 0, i32* %2
br label %123
12: ; preds = %8
%13 = icmp eq i32 %7, 0
%14 = select i1 %13, i32 3, i32 -1
br label %123
15: ; preds = %4
%16 = and i32 %7, -129
switch i32 %16, label %122 [
i32 0, label %17
i32 1, label %28
i32 2, label %64
i32 3, label %69
i32 4, label %73
i32 5, label %80
i32 6, label %92
i32 7, label %103
]
17: ; preds = %15
store i8 0, i8* %0
%18 = icmp eq i32 %1, 92
br i1 %18, label %19, label %20
19: ; preds = %17
store i32 1, i32* %2
br label %123
20: ; preds = %17
%21 = and i32 %3, 128
%22 = icmp ne i32 %21, 0
%23 = icmp eq i32 %1, 37
%24 = and i1 %23, %22
br i1 %24, label %25, label %26
25: ; preds = %20
store i32 129, i32* %2
br label %123
26: ; preds = %20
%27 = trunc i32 %1 to i8
store i8 %27, i8* %0
br label %123
28: ; preds = %15
%29 = and i32 %7, 128
%30 = icmp eq i32 %29, 0
br i1 %30, label %45, label %31
31: ; preds = %28
%32 = tail call i32 @tolower(i32 %1)
%33 = shl i32 %32, 24
%34 = add i32 %33, -788529153
%35 = icmp ult i32 %34, 184549375
%36 = add i32 %33, -1610612737
%37 = icmp ult i32 %36, 117440511
%38 = or i1 %35, %37
br i1 %38, label %39, label %45
39: ; preds = %31
%40 = add i32 %1, -48
%41 = icmp ult i32 %40, 10
%42 = add i32 %32, 159
%43 = select i1 %41, i32 %40, i32 %42
%44 = trunc i32 %43 to i8
store i8 %44, i8* %0
store i32 7, i32* %2
br label %123
45: ; preds = %31, %28
switch i32 %1, label %63 [
i32 92, label %46
i32 48, label %47
i32 49, label %47
i32 50, label %47
i32 51, label %47
i32 52, label %47
i32 53, label %47
i32 54, label %47
i32 55, label %47
i32 77, label %50
i32 94, label %51
i32 110, label %52
i32 114, label %53
i32 98, label %54
i32 97, label %55
i32 118, label %56
i32 116, label %57
i32 102, label %58
i32 115, label %59
i32 69, label %60
i32 10, label %61
i32 36, label %62
]
46: ; preds = %45
store i8 92, i8* %0
store i32 0, i32* %2
br label %123
47: ; preds = %45, %45, %45, %45, %45, %45, %45, %45
%48 = trunc i32 %1 to i8
%49 = add nsw i8 %48, -48
store i8 %49, i8* %0
store i32 5, i32* %2
br label %123
50: ; preds = %45
store i8 -128, i8* %0
store i32 2, i32* %2
br label %123
51: ; preds = %45
store i32 4, i32* %2
br label %123
52: ; preds = %45
store i8 10, i8* %0
store i32 0, i32* %2
br label %123
53: ; preds = %45
store i8 13, i8* %0
store i32 0, i32* %2
br label %123
54: ; preds = %45
store i8 8, i8* %0
store i32 0, i32* %2
br label %123
55: ; preds = %45
store i8 7, i8* %0
store i32 0, i32* %2
br label %123
56: ; preds = %45
store i8 11, i8* %0
store i32 0, i32* %2
br label %123
57: ; preds = %45
store i8 9, i8* %0
store i32 0, i32* %2
br label %123
58: ; preds = %45
store i8 12, i8* %0
store i32 0, i32* %2
br label %123
59: ; preds = %45
store i8 32, i8* %0
store i32 0, i32* %2
br label %123
60: ; preds = %45
store i8 27, i8* %0
store i32 0, i32* %2
br label %123
61: ; preds = %45
store i32 0, i32* %2
br label %123
62: ; preds = %45
store i32 0, i32* %2
br label %123
63: ; preds = %45
store i32 0, i32* %2
br label %123
64: ; preds = %15
switch i32 %1, label %66 [
i32 45, label %67
i32 94, label %65
]
65: ; preds = %64
br label %67
66: ; preds = %64
store i32 0, i32* %2
br label %123
67: ; preds = %64, %65
%68 = phi i32 [ 4, %65 ], [ 3, %64 ]
store i32 %68, i32* %2
br label %123
69: ; preds = %15
store i32 0, i32* %2
%70 = load i8, i8* %0
%71 = trunc i32 %1 to i8
%72 = or i8 %70, %71
store i8 %72, i8* %0
br label %123
73: ; preds = %15
%74 = icmp eq i32 %1, 63
%75 = load i8, i8* %0
%76 = trunc i32 %1 to i8
%77 = and i8 %76, 31
%78 = select i1 %74, i8 127, i8 %77
%79 = or i8 %75, %78
store i8 %79, i8* %0
store i32 0, i32* %2
br label %123
80: ; preds = %15
%81 = shl i32 %1, 24
%82 = add i32 %81, -788529153
%83 = icmp ult i32 %82, 150994943
br i1 %83, label %84, label %91
84: ; preds = %80
%85 = load i8, i8* %0
%86 = sext i8 %85 to i32
%87 = shl nsw i32 %86, 3
%88 = add i32 %1, 208
%89 = add i32 %88, %87
%90 = trunc i32 %89 to i8
store i8 %90, i8* %0
store i32 6, i32* %2
br label %123
91: ; preds = %80
store i32 0, i32* %2
br label %123
92: ; preds = %15
store i32 0, i32* %2
%93 = shl i32 %1, 24
%94 = add i32 %93, -788529153
%95 = icmp ult i32 %94, 150994943
br i1 %95, label %96, label %123
96: ; preds = %92
%97 = load i8, i8* %0
%98 = sext i8 %97 to i32
%99 = shl nsw i32 %98, 3
%100 = add i32 %1, 208
%101 = add i32 %100, %99
%102 = trunc i32 %101 to i8
store i8 %102, i8* %0
br label %123
103: ; preds = %15
%104 = tail call i32 @tolower(i32 %1)
%105 = shl i32 %104, 24
%106 = add i32 %105, -788529153
%107 = icmp ult i32 %106, 184549375
%108 = add i32 %105, -1610612737
%109 = icmp ult i32 %108, 117440511
%110 = or i1 %107, %109
br i1 %110, label %111, label %121
111: ; preds = %103
%112 = add i32 %1, -48
%113 = icmp ult i32 %112, 10
%114 = load i8, i8* %0
%115 = sext i8 %114 to i32
%116 = shl nsw i32 %115, 4
%117 = add i32 %104, 169
%118 = select i1 %113, i32 %112, i32 %117
%119 = add i32 %116, %118
%120 = trunc i32 %119 to i8
store i8 %120, i8* %0
br label %121
121: ; preds = %103, %111
store i32 0, i32* %2
br label %123
122: ; preds = %15
store i32 0, i32* %2
br label %123
123: ; preds = %92, %122, %121, %96, %91, %84, %73, %69, %67, %66, %63, %62, %61, %60, %59, %58, %57, %56, %55, %54, %53, %52, %51, %50, %47, %46, %39, %26, %25, %19, %12, %11
%124 = phi i32 [ 1, %11 ], [ %14, %12 ], [ -1, %122 ], [ 1, %121 ], [ 1, %96 ], [ 0, %84 ], [ 2, %91 ], [ 1, %73 ], [ 1, %69 ], [ 0, %67 ], [ -1, %66 ], [ 0, %39 ], [ -1, %63 ], [ 3, %62 ], [ 3, %61 ], [ 1, %60 ], [ 1, %59 ], [ 1, %58 ], [ 1, %57 ], [ 1, %56 ], [ 1, %55 ], [ 1, %54 ], [ 1, %53 ], [ 1, %52 ], [ 0, %51 ], [ 0, %50 ], [ 0, %47 ], [ 1, %46 ], [ 0, %19 ], [ 0, %25 ], [ 1, %26 ], [ 2, %92 ]
ret i32 %124
}