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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ assert(int);
const char *advance_declaration(const char *beg, const char *end) {
  const char *p = beg;
  char quote_char = '\0';
  char ch;
  enum {
    AC_S_DONE,
    AC_S_BACKOUT,
    AC_S_BANG,
    AC_S_DEFAULT,
    AC_S_DCLNAME,
    AC_S_DASH1,
    AC_S_DASH2,
    AC_S_COMMENT,
    AC_S_DASH3,
    AC_S_DASH4,
    AC_S_QUOTE1,
    AC_S_IN_QUOTE,
    AC_S_QUOTE2
  } state = AC_S_BANG;
  if (beg == end)
    return beg;
  ch = *p++;
  while (state != AC_S_DONE && state != AC_S_BACKOUT) {
    if (p == end)
      state = AC_S_BACKOUT;
    switch (state) {
    case AC_S_DONE:
    case AC_S_BACKOUT:
      break;
    case AC_S_BANG:
      if (ch == '!') {
        ch = *p++;
        state = AC_S_DEFAULT;
      } else
        state = AC_S_BACKOUT;
      break;
    case AC_S_DEFAULT:
      switch (ch) {
      case '-':
        state = AC_S_DASH1;
        break;
      case ' ':
      case '\t':
      case '\r':
      case '\n':
        ch = *p++;
        break;
      case '>':
        state = AC_S_DONE;
        break;
      case '\'':
      case '\"':
        state = AC_S_QUOTE1;
        break;
      default:
        if (((ch) > 32 && (ch) < 127 && (ch) != '=' && (ch) != '>' &&
             (ch) != '/'))
          state = AC_S_DCLNAME;
        else
          state = AC_S_BACKOUT;
        break;
      }
      break;
    case AC_S_DCLNAME:
      if (ch == '-')
        state = AC_S_DASH1;
      else if (((ch) > 32 && (ch) < 127 && (ch) != '=' && (ch) != '>' &&
                (ch) != '/'))
        ch = *p++;
      else
        state = AC_S_DEFAULT;
      break;
    case AC_S_QUOTE1:
      assert(ch == '\'' || ch == 0x22);
      quote_char = ch;
      ch = *p++;
      state = AC_S_IN_QUOTE;
      break;
    case AC_S_IN_QUOTE:
      if (ch == quote_char)
        state = AC_S_QUOTE2;
      else
        ch = *p++;
      break;
    case AC_S_QUOTE2:
      assert(ch == quote_char);
      ch = *p++;
      state = AC_S_DEFAULT;
      break;
    case AC_S_DASH1:
      assert(ch == '-');
      ch = *p++;
      state = AC_S_DASH2;
      break;
    case AC_S_DASH2:
      switch (ch) {
      case '-':
        ch = *p++;
        state = AC_S_COMMENT;
        break;
      default:
        state = AC_S_BACKOUT;
      }
      break;
    case AC_S_COMMENT:
      switch (ch) {
      case '-':
        state = AC_S_DASH3;
        break;
      default:
        ch = *p++;
        break;
      }
      break;
    case AC_S_DASH3:
      assert(ch == '-');
      ch = *p++;
      state = AC_S_DASH4;
      break;
    case AC_S_DASH4:
      switch (ch) {
      case '-':
        ch = *p++;
        state = AC_S_DEFAULT;
        break;
      default:
        state = AC_S_COMMENT;
        break;
      }
      break;
    }
  }
  if (state == AC_S_BACKOUT) {
    return beg + 1;
  }
  return p;
}


x86 assembly (clang, -O0):
<advance_declaration>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
movb   $0x0,-0x21(%rbp)
movl   $0x2,-0x28(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
jne    114e <advance_declaration+0x3e>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1547 <advance_declaration+0x437>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x28(%rbp)
mov    %al,-0x29(%rbp)
je     117b <advance_declaration+0x6b>
cmpl   $0x1,-0x28(%rbp)
setne  %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    118b <advance_declaration+0x7b>
jmp    1524 <advance_declaration+0x414>
mov    -0x20(%rbp),%rax
cmp    -0x18(%rbp),%rax
jne    11a0 <advance_declaration+0x90>
movl   $0x1,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %rax,-0x38(%rbp)
sub    $0xc,%rax
ja     151f <advance_declaration+0x40f>
mov    -0x38(%rbp),%rax
lea    0xe44(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
jmp    151f <advance_declaration+0x40f>
movsbl -0x22(%rbp),%eax
cmp    $0x21,%eax
jne    11f7 <advance_declaration+0xe7>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
movl   $0x3,-0x28(%rbp)
jmp    11fe <advance_declaration+0xee>
movl   $0x1,-0x28(%rbp)
jmp    151f <advance_declaration+0x40f>
movsbl -0x22(%rbp),%eax
add    $0xfffffff7,%eax
mov    %eax,%ecx
mov    %rcx,-0x40(%rbp)
sub    $0x35,%eax
ja     126a <advance_declaration+0x15a>
mov    -0x40(%rbp),%rax
lea    0xe10(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x5,-0x28(%rbp)
jmp    12c3 <advance_declaration+0x1b3>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
jmp    12c3 <advance_declaration+0x1b3>
movl   $0x0,-0x28(%rbp)
jmp    12c3 <advance_declaration+0x1b3>
movl   $0xa,-0x28(%rbp)
jmp    12c3 <advance_declaration+0x1b3>
movsbl -0x22(%rbp),%eax
cmp    $0x20,%eax
jle    12b7 <advance_declaration+0x1a7>
movsbl -0x22(%rbp),%eax
cmp    $0x7f,%eax
jge    12b7 <advance_declaration+0x1a7>
movsbl -0x22(%rbp),%eax
cmp    $0x3d,%eax
je     12b7 <advance_declaration+0x1a7>
movsbl -0x22(%rbp),%eax
cmp    $0x3e,%eax
je     12b7 <advance_declaration+0x1a7>
movsbl -0x22(%rbp),%eax
cmp    $0x2f,%eax
je     12b7 <advance_declaration+0x1a7>
movl   $0x4,-0x28(%rbp)
jmp    12be <advance_declaration+0x1ae>
movl   $0x1,-0x28(%rbp)
jmp    12c3 <advance_declaration+0x1b3>
jmp    151f <advance_declaration+0x40f>
movsbl -0x22(%rbp),%eax
cmp    $0x2d,%eax
jne    12e1 <advance_declaration+0x1d1>
movl   $0x5,-0x28(%rbp)
jmp    1347 <advance_declaration+0x237>
movsbl -0x22(%rbp),%eax
cmp    $0x20,%eax
jle    133b <advance_declaration+0x22b>
movsbl -0x22(%rbp),%eax
cmp    $0x7f,%eax
jge    133b <advance_declaration+0x22b>
movsbl -0x22(%rbp),%eax
cmp    $0x3d,%eax
je     133b <advance_declaration+0x22b>
movsbl -0x22(%rbp),%eax
cmp    $0x3e,%eax
je     133b <advance_declaration+0x22b>
movsbl -0x22(%rbp),%eax
cmp    $0x2f,%eax
je     133b <advance_declaration+0x22b>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
jmp    1342 <advance_declaration+0x232>
movl   $0x3,-0x28(%rbp)
jmp    1347 <advance_declaration+0x237>
jmp    151f <advance_declaration+0x40f>
movsbl -0x22(%rbp),%ecx
mov    $0x1,%al
cmp    $0x27,%ecx
mov    %al,-0x41(%rbp)
je     136b <advance_declaration+0x25b>
movsbl -0x22(%rbp),%eax
cmp    $0x22,%eax
sete   %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    -0x22(%rbp),%al
mov    %al,-0x21(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
movl   $0xb,-0x28(%rbp)
jmp    151f <advance_declaration+0x40f>
movsbl -0x22(%rbp),%eax
movsbl -0x21(%rbp),%ecx
cmp    %ecx,%eax
jne    13ba <advance_declaration+0x2aa>
movl   $0xc,-0x28(%rbp)
jmp    13ce <advance_declaration+0x2be>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
jmp    151f <advance_declaration+0x40f>
movsbl -0x22(%rbp),%eax
movsbl -0x21(%rbp),%ecx
cmp    %ecx,%eax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
movl   $0x3,-0x28(%rbp)
jmp    151f <advance_declaration+0x40f>
movsbl -0x22(%rbp),%eax
cmp    $0x2d,%eax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
movl   $0x6,-0x28(%rbp)
jmp    151f <advance_declaration+0x40f>
mov    -0x22(%rbp),%al
sub    $0x2d,%al
jne    146e <advance_declaration+0x35e>
jmp    144e <advance_declaration+0x33e>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
movl   $0x7,-0x28(%rbp)
jmp    1475 <advance_declaration+0x365>
movl   $0x1,-0x28(%rbp)
jmp    151f <advance_declaration+0x40f>
mov    -0x22(%rbp),%al
sub    $0x2d,%al
jne    1496 <advance_declaration+0x386>
jmp    148a <advance_declaration+0x37a>
movl   $0x8,-0x28(%rbp)
jmp    14aa <advance_declaration+0x39a>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
jmp    151f <advance_declaration+0x40f>
movsbl -0x22(%rbp),%eax
cmp    $0x2d,%eax
sete   %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
movl   $0x9,-0x28(%rbp)
jmp    151f <advance_declaration+0x40f>
mov    -0x22(%rbp),%al
sub    $0x2d,%al
jne    1513 <advance_declaration+0x403>
jmp    14f3 <advance_declaration+0x3e3>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    (%rax),%al
mov    %al,-0x22(%rbp)
movl   $0x3,-0x28(%rbp)
jmp    151a <advance_declaration+0x40a>
movl   $0x7,-0x28(%rbp)
jmp    151f <advance_declaration+0x40f>
jmp    1162 <advance_declaration+0x52>
cmpl   $0x1,-0x28(%rbp)
jne    153f <advance_declaration+0x42f>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1547 <advance_declaration+0x437>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<advance_declaration>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
cmp    %rsi,%rdi
je     132c <advance_declaration+0x21c>
mov    %rsi,%r15
mov    (%rdi),%r14b
add    $0x1,%rdi
mov    $0x2,%eax
xor    %r13d,%r13d
mov    $0x1,%r12d
lea    0xebd(%rip),%rbp
mov    %rdi,(%rsp)
mov    %rdi,%rbx
jmp    1170 <advance_declaration+0x60>
xor    %edi,%edi
cmp    %r13b,%r14b
sete   %dil
call   1030 <assert@plt>
movzbl (%rbx),%r14d
add    $0x1,%rbx
mov    $0x3,%eax
cmp    $0x1,%eax
jbe    1324 <advance_declaration+0x214>
cmp    %r15,%rbx
cmove  %r12d,%eax
lea    -0x2(%rax),%ecx
cmp    $0xa,%ecx
ja     1167 <advance_declaration+0x57>
movslq 0x0(%rbp,%rcx,4),%rax
add    %rbp,%rax
jmp    *%rax
cmp    $0x21,%r14b
je     115a <advance_declaration+0x4a>
jmp    1326 <advance_declaration+0x216>
cmp    $0x2d,%r14b
jne    129f <advance_declaration+0x18f>
mov    $0x5,%eax
mov    $0x2d,%r14b
jmp    1167 <advance_declaration+0x57>
cmp    $0x2d,%r14b
je     1229 <advance_declaration+0x119>
jmp    1326 <advance_declaration+0x216>
mov    $0xc,%eax
cmp    %r13b,%r14b
jne    12e1 <advance_declaration+0x1d1>
mov    %r14d,%r13d
jmp    1167 <advance_declaration+0x57>
movsbl %r14b,%ecx
add    $0xfffffff7,%ecx
cmp    $0x35,%ecx
ja     12f3 <advance_declaration+0x1e3>
mov    $0x5,%eax
lea    0xe4a(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0xa,%eax
jmp    1167 <advance_declaration+0x57>
xor    %edi,%edi
cmp    $0x2d,%r14b
sete   %dil
call   1030 <assert@plt>
movzbl (%rbx),%r14d
add    $0x1,%rbx
mov    $0x6,%eax
jmp    1167 <advance_declaration+0x57>
cmp    $0x2d,%r14b
jne    1229 <advance_declaration+0x119>
mov    $0x8,%eax
mov    $0x2d,%r14b
jmp    1167 <advance_declaration+0x57>
movzbl (%rbx),%r14d
add    $0x1,%rbx
mov    $0x7,%eax
jmp    1167 <advance_declaration+0x57>
xor    %edi,%edi
cmp    $0x2d,%r14b
sete   %dil
call   1030 <assert@plt>
movzbl (%rbx),%r14d
add    $0x1,%rbx
mov    $0x9,%eax
jmp    1167 <advance_declaration+0x57>
mov    $0x7,%eax
cmp    $0x2d,%r14b
je     115a <advance_declaration+0x4a>
jmp    1167 <advance_declaration+0x57>
cmp    $0x27,%r14b
sete   %al
cmp    $0x22,%r14b
sete   %cl
or     %al,%cl
movzbl %cl,%edi
call   1030 <assert@plt>
mov    %r14d,%r13d
movzbl (%rbx),%ecx
add    $0x1,%rbx
mov    $0xb,%eax
mov    %ecx,%r14d
jmp    1167 <advance_declaration+0x57>
lea    -0x21(%r14),%ecx
mov    $0x3,%eax
cmp    $0x5d,%cl
ja     1167 <advance_declaration+0x57>
cmp    $0x3e,%r14b
ja     12cf <advance_declaration+0x1bf>
movzbl %r14b,%ecx
movabs $0x6000800000000000,%rdx
bt     %rcx,%rdx
jb     1167 <advance_declaration+0x57>
movzbl (%rbx),%r14d
add    $0x1,%rbx
mov    $0x4,%eax
jmp    1167 <advance_declaration+0x57>
movzbl (%rbx),%r14d
add    $0x1,%rbx
mov    $0xb,%eax
jmp    1167 <advance_declaration+0x57>
lea    -0x21(%r14),%eax
cmp    $0x5d,%al
ja     1326 <advance_declaration+0x216>
mov    $0x4,%eax
cmp    $0x3e,%r14b
ja     1167 <advance_declaration+0x57>
movzbl %r14b,%ecx
movabs $0x6000800000000000,%rdx
bt     %rcx,%rdx
jae    1167 <advance_declaration+0x57>
jmp    1326 <advance_declaration+0x216>
jne    132f <advance_declaration+0x21f>
mov    (%rsp),%rbx
jmp    132f <advance_declaration+0x21f>
mov    %rdi,%rbx
mov    %rbx,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i8* @advance_declaration(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i8
%8 = alloca i8
%9 = alloca i32
store i8* %0, i8** %4
store i8* %1, i8** %5
%10 = load i8*, i8** %4
store i8* %10, i8** %6
store i8 0, i8* %7
store i32 2, i32* %9
%11 = load i8*, i8** %4
%12 = load i8*, i8** %5
%13 = icmp eq i8* %11, %12
br i1 %13, label %14, label %16
14: ; preds = %2
%15 = load i8*, i8** %4
store i8* %15, i8** %3
br label %205
16: ; preds = %2
%17 = load i8*, i8** %6
%18 = getelementptr inbounds i8, i8* %17, i32 1
store i8* %18, i8** %6
%19 = load i8, i8* %17
store i8 %19, i8* %8
br label %20
20: ; preds = %196, %16
%21 = load i32, i32* %9
%22 = icmp ne i32 %21, 0
br i1 %22, label %23, label %26
23: ; preds = %20
%24 = load i32, i32* %9
%25 = icmp ne i32 %24, 1
br label %26
26: ; preds = %23, %20
%27 = phi i1 [ false, %20 ], [ %25, %23 ]
br i1 %27, label %28, label %197
28: ; preds = %26
%29 = load i8*, i8** %6
%30 = load i8*, i8** %5
%31 = icmp eq i8* %29, %30
br i1 %31, label %32, label %33
32: ; preds = %28
store i32 1, i32* %9
br label %33
33: ; preds = %32, %28
%34 = load i32, i32* %9
switch i32 %34, label %196 [
i32 0, label %35
i32 1, label %35
i32 2, label %36
i32 3, label %46
i32 4, label %80
i32 10, label %112
i32 11, label %128
i32 12, label %140
i32 5, label %151
i32 6, label %160
i32 7, label %169
i32 8, label %178
i32 9, label %187
]
35: ; preds = %33, %33
br label %196
36: ; preds = %33
%37 = load i8, i8* %8
%38 = sext i8 %37 to i32
%39 = icmp eq i32 %38, 33
br i1 %39, label %40, label %44
40: ; preds = %36
%41 = load i8*, i8** %6
%42 = getelementptr inbounds i8, i8* %41, i32 1
store i8* %42, i8** %6
%43 = load i8, i8* %41
store i8 %43, i8* %8
store i32 3, i32* %9
br label %45
44: ; preds = %36
store i32 1, i32* %9
br label %45
45: ; preds = %44, %40
br label %196
46: ; preds = %33
%47 = load i8, i8* %8
%48 = sext i8 %47 to i32
switch i32 %48, label %56 [
i32 45, label %49
i32 32, label %50
i32 9, label %50
i32 13, label %50
i32 10, label %50
i32 62, label %54
i32 39, label %55
i32 34, label %55
]
49: ; preds = %46
store i32 5, i32* %9
br label %79
50: ; preds = %46, %46, %46, %46
%51 = load i8*, i8** %6
%52 = getelementptr inbounds i8, i8* %51, i32 1
store i8* %52, i8** %6
%53 = load i8, i8* %51
store i8 %53, i8* %8
br label %79
54: ; preds = %46
store i32 0, i32* %9
br label %79
55: ; preds = %46, %46
store i32 10, i32* %9
br label %79
56: ; preds = %46
%57 = load i8, i8* %8
%58 = sext i8 %57 to i32
%59 = icmp sgt i32 %58, 32
br i1 %59, label %60, label %77
60: ; preds = %56
%61 = load i8, i8* %8
%62 = sext i8 %61 to i32
%63 = icmp slt i32 %62, 127
br i1 %63, label %64, label %77
64: ; preds = %60
%65 = load i8, i8* %8
%66 = sext i8 %65 to i32
%67 = icmp ne i32 %66, 61
br i1 %67, label %68, label %77
68: ; preds = %64
%69 = load i8, i8* %8
%70 = sext i8 %69 to i32
%71 = icmp ne i32 %70, 62
br i1 %71, label %72, label %77
72: ; preds = %68
%73 = load i8, i8* %8
%74 = sext i8 %73 to i32
%75 = icmp ne i32 %74, 47
br i1 %75, label %76, label %77
76: ; preds = %72
store i32 4, i32* %9
br label %78
77: ; preds = %72, %68, %64, %60, %56
store i32 1, i32* %9
br label %78
78: ; preds = %77, %76
br label %79
79: ; preds = %78, %55, %54, %50, %49
br label %196
80: ; preds = %33
%81 = load i8, i8* %8
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %82, 45
br i1 %83, label %84, label %85
84: ; preds = %80
store i32 5, i32* %9
br label %111
85: ; preds = %80
%86 = load i8, i8* %8
%87 = sext i8 %86 to i32
%88 = icmp sgt i32 %87, 32
br i1 %88, label %89, label %109
89: ; preds = %85
%90 = load i8, i8* %8
%91 = sext i8 %90 to i32
%92 = icmp slt i32 %91, 127
br i1 %92, label %93, label %109
93: ; preds = %89
%94 = load i8, i8* %8
%95 = sext i8 %94 to i32
%96 = icmp ne i32 %95, 61
br i1 %96, label %97, label %109
97: ; preds = %93
%98 = load i8, i8* %8
%99 = sext i8 %98 to i32
%100 = icmp ne i32 %99, 62
br i1 %100, label %101, label %109
101: ; preds = %97
%102 = load i8, i8* %8
%103 = sext i8 %102 to i32
%104 = icmp ne i32 %103, 47
br i1 %104, label %105, label %109
105: ; preds = %101
%106 = load i8*, i8** %6
%107 = getelementptr inbounds i8, i8* %106, i32 1
store i8* %107, i8** %6
%108 = load i8, i8* %106
store i8 %108, i8* %8
br label %110
109: ; preds = %101, %97, %93, %89, %85
store i32 3, i32* %9
br label %110
110: ; preds = %109, %105
br label %111
111: ; preds = %110, %84
br label %196
112: ; preds = %33
%113 = load i8, i8* %8
%114 = sext i8 %113 to i32
%115 = icmp eq i32 %114, 39
br i1 %115, label %120, label %116
116: ; preds = %112
%117 = load i8, i8* %8
%118 = sext i8 %117 to i32
%119 = icmp eq i32 %118, 34
br label %120
120: ; preds = %116, %112
%121 = phi i1 [ true, %112 ], [ %119, %116 ]
%122 = zext i1 %121 to i32
%123 = call i32 @assert(i32 %122)
%124 = load i8, i8* %8
store i8 %124, i8* %7
%125 = load i8*, i8** %6
%126 = getelementptr inbounds i8, i8* %125, i32 1
store i8* %126, i8** %6
%127 = load i8, i8* %125
store i8 %127, i8* %8
store i32 11, i32* %9
br label %196
128: ; preds = %33
%129 = load i8, i8* %8
%130 = sext i8 %129 to i32
%131 = load i8, i8* %7
%132 = sext i8 %131 to i32
%133 = icmp eq i32 %130, %132
br i1 %133, label %134, label %135
134: ; preds = %128
store i32 12, i32* %9
br label %139
135: ; preds = %128
%136 = load i8*, i8** %6
%137 = getelementptr inbounds i8, i8* %136, i32 1
store i8* %137, i8** %6
%138 = load i8, i8* %136
store i8 %138, i8* %8
br label %139
139: ; preds = %135, %134
br label %196
140: ; preds = %33
%141 = load i8, i8* %8
%142 = sext i8 %141 to i32
%143 = load i8, i8* %7
%144 = sext i8 %143 to i32
%145 = icmp eq i32 %142, %144
%146 = zext i1 %145 to i32
%147 = call i32 @assert(i32 %146)
%148 = load i8*, i8** %6
%149 = getelementptr inbounds i8, i8* %148, i32 1
store i8* %149, i8** %6
%150 = load i8, i8* %148
store i8 %150, i8* %8
store i32 3, i32* %9
br label %196
151: ; preds = %33
%152 = load i8, i8* %8
%153 = sext i8 %152 to i32
%154 = icmp eq i32 %153, 45
%155 = zext i1 %154 to i32
%156 = call i32 @assert(i32 %155)
%157 = load i8*, i8** %6
%158 = getelementptr inbounds i8, i8* %157, i32 1
store i8* %158, i8** %6
%159 = load i8, i8* %157
store i8 %159, i8* %8
store i32 6, i32* %9
br label %196
160: ; preds = %33
%161 = load i8, i8* %8
%162 = sext i8 %161 to i32
switch i32 %162, label %167 [
i32 45, label %163
]
163: ; preds = %160
%164 = load i8*, i8** %6
%165 = getelementptr inbounds i8, i8* %164, i32 1
store i8* %165, i8** %6
%166 = load i8, i8* %164
store i8 %166, i8* %8
store i32 7, i32* %9
br label %168
167: ; preds = %160
store i32 1, i32* %9
br label %168
168: ; preds = %167, %163
br label %196
169: ; preds = %33
%170 = load i8, i8* %8
%171 = sext i8 %170 to i32
switch i32 %171, label %173 [
i32 45, label %172
]
172: ; preds = %169
store i32 8, i32* %9
br label %177
173: ; preds = %169
%174 = load i8*, i8** %6
%175 = getelementptr inbounds i8, i8* %174, i32 1
store i8* %175, i8** %6
%176 = load i8, i8* %174
store i8 %176, i8* %8
br label %177
177: ; preds = %173, %172
br label %196
178: ; preds = %33
%179 = load i8, i8* %8
%180 = sext i8 %179 to i32
%181 = icmp eq i32 %180, 45
%182 = zext i1 %181 to i32
%183 = call i32 @assert(i32 %182)
%184 = load i8*, i8** %6
%185 = getelementptr inbounds i8, i8* %184, i32 1
store i8* %185, i8** %6
%186 = load i8, i8* %184
store i8 %186, i8* %8
store i32 9, i32* %9
br label %196
187: ; preds = %33
%188 = load i8, i8* %8
%189 = sext i8 %188 to i32
switch i32 %189, label %194 [
i32 45, label %190
]
190: ; preds = %187
%191 = load i8*, i8** %6
%192 = getelementptr inbounds i8, i8* %191, i32 1
store i8* %192, i8** %6
%193 = load i8, i8* %191
store i8 %193, i8* %8
store i32 3, i32* %9
br label %195
194: ; preds = %187
store i32 7, i32* %9
br label %195
195: ; preds = %194, %190
br label %196
196: ; preds = %33, %195, %178, %177, %168, %151, %140, %139, %120, %111, %79, %45, %35
br label %20
197: ; preds = %26
%198 = load i32, i32* %9
%199 = icmp eq i32 %198, 1
br i1 %199, label %200, label %203
200: ; preds = %197
%201 = load i8*, i8** %4
%202 = getelementptr inbounds i8, i8* %201, i64 1
store i8* %202, i8** %3
br label %205
203: ; preds = %197
%204 = load i8*, i8** %6
store i8* %204, i8** %3
br label %205
205: ; preds = %203, %200, %14
%206 = load i8*, i8** %3
ret i8* %206
}

LLVM IR (-O2):
define i8* @advance_declaration(i8* %0, i8* readnone %1) {
%3 = icmp eq i8* %0, %1
br i1 %3, label %95, label %4
4: ; preds = %2
%5 = getelementptr inbounds i8, i8* %0, i64 1
%6 = load i8, i8* %0
br label %7
7: ; preds = %4, %86
%8 = phi i32 [ 2, %4 ], [ %90, %86 ]
%9 = phi i8 [ %6, %4 ], [ %89, %86 ]
%10 = phi i8 [ 0, %4 ], [ %88, %86 ]
%11 = phi i8* [ %5, %4 ], [ %87, %86 ]
%12 = icmp eq i8* %11, %1
%13 = select i1 %12, i32 1, i32 %8
switch i32 %13, label %86 [
i32 9, label %81
i32 8, label %75
i32 2, label %14
i32 3, label %19
i32 4, label %30
i32 10, label %40
i32 11, label %48
i32 12, label %53
i32 5, label %59
i32 6, label %65
i32 7, label %70
]
14: ; preds = %7
%15 = icmp eq i8 %9, 33
br i1 %15, label %16, label %94
16: ; preds = %14
%17 = getelementptr inbounds i8, i8* %11, i64 1
%18 = load i8, i8* %11
br label %86
19: ; preds = %7
%20 = sext i8 %9 to i32
switch i32 %20, label %25 [
i32 45, label %86
i32 32, label %21
i32 9, label %21
i32 13, label %21
i32 10, label %21
i32 62, label %95
i32 39, label %24
i32 34, label %24
]
21: ; preds = %19, %19, %19, %19
%22 = getelementptr inbounds i8, i8* %11, i64 1
%23 = load i8, i8* %11
br label %86
24: ; preds = %19, %19
br label %86
25: ; preds = %19
%26 = freeze i8 %9
%27 = add i8 %26, -33
%28 = icmp ult i8 %27, 94
br i1 %28, label %29, label %94
29: ; preds = %25
switch i8 %26, label %86 [
i8 62, label %94
i8 61, label %94
i8 47, label %94
]
30: ; preds = %7
%31 = icmp eq i8 %9, 45
br i1 %31, label %86, label %32
32: ; preds = %30
%33 = freeze i8 %9
%34 = add i8 %33, -33
%35 = icmp ult i8 %34, 94
br i1 %35, label %36, label %86
36: ; preds = %32
switch i8 %33, label %37 [
i8 62, label %86
i8 61, label %86
i8 47, label %86
]
37: ; preds = %36
%38 = getelementptr inbounds i8, i8* %11, i64 1
%39 = load i8, i8* %11
br label %86
40: ; preds = %7
%41 = icmp eq i8 %9, 39
%42 = icmp eq i8 %9, 34
%43 = or i1 %41, %42
%44 = zext i1 %43 to i32
%45 = tail call i32 @assert(i32 %44)
%46 = getelementptr inbounds i8, i8* %11, i64 1
%47 = load i8, i8* %11
br label %86
48: ; preds = %7
%49 = icmp eq i8 %9, %10
br i1 %49, label %86, label %50
50: ; preds = %48
%51 = getelementptr inbounds i8, i8* %11, i64 1
%52 = load i8, i8* %11
br label %86
53: ; preds = %7
%54 = icmp eq i8 %9, %10
%55 = zext i1 %54 to i32
%56 = tail call i32 @assert(i32 %55)
%57 = getelementptr inbounds i8, i8* %11, i64 1
%58 = load i8, i8* %11
br label %86
59: ; preds = %7
%60 = icmp eq i8 %9, 45
%61 = zext i1 %60 to i32
%62 = tail call i32 @assert(i32 %61)
%63 = getelementptr inbounds i8, i8* %11, i64 1
%64 = load i8, i8* %11
br label %86
65: ; preds = %7
%66 = icmp eq i8 %9, 45
br i1 %66, label %67, label %94
67: ; preds = %65
%68 = getelementptr inbounds i8, i8* %11, i64 1
%69 = load i8, i8* %11
br label %86
70: ; preds = %7
%71 = icmp eq i8 %9, 45
br i1 %71, label %86, label %72
72: ; preds = %70
%73 = getelementptr inbounds i8, i8* %11, i64 1
%74 = load i8, i8* %11
br label %86
75: ; preds = %7
%76 = icmp eq i8 %9, 45
%77 = zext i1 %76 to i32
%78 = tail call i32 @assert(i32 %77)
%79 = getelementptr inbounds i8, i8* %11, i64 1
%80 = load i8, i8* %11
br label %86
81: ; preds = %7
%82 = icmp eq i8 %9, 45
br i1 %82, label %83, label %86
83: ; preds = %81
%84 = getelementptr inbounds i8, i8* %11, i64 1
%85 = load i8, i8* %11
br label %86
86: ; preds = %81, %70, %48, %32, %36, %36, %36, %30, %29, %19, %83, %72, %67, %50, %37, %21, %24, %16, %7, %75, %59, %53, %40
%87 = phi i8* [ %11, %7 ], [ %73, %72 ], [ %68, %67 ], [ %63, %59 ], [ %57, %53 ], [ %51, %50 ], [ %46, %40 ], [ %38, %37 ], [ %11, %24 ], [ %22, %21 ], [ %17, %16 ], [ %79, %75 ], [ %84, %83 ], [ %11, %19 ], [ %11, %29 ], [ %11, %30 ], [ %11, %36 ], [ %11, %36 ], [ %11, %36 ], [ %11, %32 ], [ %11, %48 ], [ %11, %70 ], [ %11, %81 ]
%88 = phi i8 [ %10, %7 ], [ %10, %72 ], [ %10, %67 ], [ %10, %59 ], [ %10, %53 ], [ %10, %50 ], [ %9, %40 ], [ %10, %37 ], [ %10, %24 ], [ %10, %21 ], [ %10, %16 ], [ %10, %75 ], [ %10, %83 ], [ %10, %19 ], [ %10, %29 ], [ %10, %30 ], [ %10, %36 ], [ %10, %36 ], [ %10, %36 ], [ %10, %32 ], [ %9, %48 ], [ %10, %70 ], [ %10, %81 ]
%89 = phi i8 [ %9, %7 ], [ %74, %72 ], [ %69, %67 ], [ %64, %59 ], [ %58, %53 ], [ %52, %50 ], [ %47, %40 ], [ %39, %37 ], [ %9, %24 ], [ %23, %21 ], [ %18, %16 ], [ %80, %75 ], [ %85, %83 ], [ %9, %19 ], [ %26, %29 ], [ 45, %30 ], [ %33, %36 ], [ %33, %36 ], [ %33, %36 ], [ %33, %32 ], [ %9, %48 ], [ 45, %70 ], [ %9, %81 ]
%90 = phi i32 [ %13, %7 ], [ 7, %72 ], [ 7, %67 ], [ 6, %59 ], [ 3, %53 ], [ 11, %50 ], [ 11, %40 ], [ 4, %37 ], [ 10, %24 ], [ 3, %21 ], [ 3, %16 ], [ 9, %75 ], [ 3, %83 ], [ 5, %19 ], [ 4, %29 ], [ 5, %30 ], [ 3, %36 ], [ 3, %36 ], [ 3, %36 ], [ 3, %32 ], [ 12, %48 ], [ 8, %70 ], [ 7, %81 ]
%91 = icmp ult i32 %90, 2
br i1 %91, label %92, label %7
92: ; preds = %86
%93 = icmp eq i32 %90, 1
br i1 %93, label %94, label %95
94: ; preds = %25, %29, %29, %29, %14, %65, %92
br label %95
95: ; preds = %19, %94, %92, %2
%96 = phi i8* [ %0, %2 ], [ %5, %94 ], [ %87, %92 ], [ %11, %19 ]
ret i8* %96
}