#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(char const *);
int esc_decode(const char *s, char **end) {
  char c, *p;
  int x;
  assert(s);
  if (!end)
    end = &p;
  if (!*s) {
    *end = (char *)s;
    return -1;
  }
  c = *s++;
  if (c != '\\') {
    *end = (char *)s;
    return c;
  }
  c = *s++;
  *end = (char *)s;
  switch (c) {
  case 'a':
    return '\a';
  case 'b':
    return '\b';
  case 'f':
    return '\f';
  case 'n':
    return '\n';
  case 'r':
    return '\r';
  case 't':
    return '\t';
  case 'v':
    return '\v';
  case '0':
  case '1':
  case '2':
  case '3':
  case '4':
  case '5':
  case '6':
  case '7':
    x = c - '0';
    c = *s;
    if ((c >= '0') && (c <= '7'))
      x = (x << 3) + c - '0';
    else
      return x;
    c = *++s;
    *end = (char *)s;
    if ((c >= '0') && (c <= '7'))
      x = (x << 3) + c - '0';
    else
      return x;
    *end = (char *)(s + 1);
    return x & 0xff;
  case 'x':
    c = *s;
    if ((c >= '0') && (c <= '9'))
      x = c - '0';
    else if ((c >= 'a') && (c <= 'f'))
      x = c - 'a' + 10;
    else if ((c >= 'A') && (c <= 'F'))
      x = c - 'A' + 10;
    else
      return 'x';
    c = *++s;
    *end = (char *)s;
    if ((c >= '0') && (c <= '9'))
      x = (x << 4) + c - '0';
    else if ((c >= 'a') && (c <= 'f'))
      x = (x << 4) + c - 'a' + 10;
    else if ((c >= 'A') && (c <= 'F'))
      x = (x << 4) + c - 'A' + 10;
    else
      return x;
    *end = (char *)(s + 1);
    return x;
  default:
    if (!*s)
      return '\\';
    *end = (char *)(s + 1);
    return (unsigned char)*s;
  }
}


x86 assembly (clang, -O0):
<esc_decode>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <assert@plt>
cmpq   $0x0,-0x18(%rbp)
jne    113c <esc_decode+0x2c>
lea    -0x28(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1160 <esc_decode+0x50>
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0xffffffff,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x19(%rbp)
movsbl -0x19(%rbp),%eax
cmp    $0x5c,%eax
je     1198 <esc_decode+0x88>
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movsbl -0x19(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x19(%rbp)
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movsbl -0x19(%rbp),%eax
add    $0xffffffd0,%eax
mov    %eax,%ecx
mov    %rcx,-0x38(%rbp)
sub    $0x48,%eax
ja     1487 <esc_decode+0x377>
mov    -0x38(%rbp),%rax
lea    0xe28(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x7,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
movl   $0x8,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
movl   $0xc,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
movl   $0xa,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
movl   $0xd,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
movl   $0x9,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
movl   $0xb,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
movsbl -0x19(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x19(%rbp)
movsbl -0x19(%rbp),%eax
cmp    $0x30,%eax
jl     1279 <esc_decode+0x169>
movsbl -0x19(%rbp),%eax
cmp    $0x37,%eax
jg     1279 <esc_decode+0x169>
mov    -0x2c(%rbp),%eax
shl    $0x3,%eax
movsbl -0x19(%rbp),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x2c(%rbp)
jmp    1284 <esc_decode+0x174>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x19(%rbp)
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movsbl -0x19(%rbp),%eax
cmp    $0x30,%eax
jl     12d5 <esc_decode+0x1c5>
movsbl -0x19(%rbp),%eax
cmp    $0x37,%eax
jg     12d5 <esc_decode+0x1c5>
mov    -0x2c(%rbp),%eax
shl    $0x3,%eax
movsbl -0x19(%rbp),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x2c(%rbp)
jmp    12e0 <esc_decode+0x1d0>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
mov    -0x10(%rbp),%rcx
add    $0x1,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x2c(%rbp),%eax
and    $0xff,%eax
mov    %eax,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
mov    -0x10(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x19(%rbp)
movsbl -0x19(%rbp),%eax
cmp    $0x30,%eax
jl     1331 <esc_decode+0x221>
movsbl -0x19(%rbp),%eax
cmp    $0x39,%eax
jg     1331 <esc_decode+0x221>
movsbl -0x19(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x2c(%rbp)
jmp    139f <esc_decode+0x28f>
movsbl -0x19(%rbp),%eax
cmp    $0x61,%eax
jl     135d <esc_decode+0x24d>
movsbl -0x19(%rbp),%eax
cmp    $0x66,%eax
jg     135d <esc_decode+0x24d>
movsbl -0x19(%rbp),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x2c(%rbp)
jmp    139a <esc_decode+0x28a>
movsbl -0x19(%rbp),%eax
cmp    $0x41,%eax
jl     1389 <esc_decode+0x279>
movsbl -0x19(%rbp),%eax
cmp    $0x46,%eax
jg     1389 <esc_decode+0x279>
movsbl -0x19(%rbp),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x2c(%rbp)
jmp    1395 <esc_decode+0x285>
movl   $0x78,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
jmp    139a <esc_decode+0x28a>
jmp    139f <esc_decode+0x28f>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x19(%rbp)
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movsbl -0x19(%rbp),%eax
cmp    $0x30,%eax
jl     13f0 <esc_decode+0x2e0>
movsbl -0x19(%rbp),%eax
cmp    $0x39,%eax
jg     13f0 <esc_decode+0x2e0>
mov    -0x2c(%rbp),%eax
shl    $0x4,%eax
movsbl -0x19(%rbp),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x2c(%rbp)
jmp    146d <esc_decode+0x35d>
movsbl -0x19(%rbp),%eax
cmp    $0x61,%eax
jl     1424 <esc_decode+0x314>
movsbl -0x19(%rbp),%eax
cmp    $0x66,%eax
jg     1424 <esc_decode+0x314>
mov    -0x2c(%rbp),%eax
shl    $0x4,%eax
movsbl -0x19(%rbp),%ecx
add    %ecx,%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %eax,-0x2c(%rbp)
jmp    1468 <esc_decode+0x358>
movsbl -0x19(%rbp),%eax
cmp    $0x41,%eax
jl     1458 <esc_decode+0x348>
movsbl -0x19(%rbp),%eax
cmp    $0x46,%eax
jg     1458 <esc_decode+0x348>
mov    -0x2c(%rbp),%eax
shl    $0x4,%eax
movsbl -0x19(%rbp),%ecx
add    %ecx,%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %eax,-0x2c(%rbp)
jmp    1463 <esc_decode+0x353>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
jmp    1468 <esc_decode+0x358>
jmp    146d <esc_decode+0x35d>
mov    -0x10(%rbp),%rcx
add    $0x1,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
jne    14a0 <esc_decode+0x390>
movl   $0x5c,-0x4(%rbp)
jmp    14b9 <esc_decode+0x3a9>
mov    -0x10(%rbp),%rcx
add    $0x1,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<esc_decode>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %rdi,%r14
call   1030 <assert@plt>
test   %rbx,%rbx
mov    %rsp,%rcx
cmovne %rbx,%rcx
movsbl (%r14),%eax
test   %eax,%eax
je     119b <esc_decode+0x8b>
cmp    $0x5c,%al
jne    11a5 <esc_decode+0x95>
lea    0x2(%r14),%rsi
movsbl 0x1(%r14),%edx
mov    %rsi,(%rcx)
add    $0xffffffd0,%edx
cmp    $0x48,%edx
ja     11b8 <esc_decode+0xa8>
mov    $0x7,%eax
lea    0xeab(%rip),%rdi
movslq (%rdi,%rdx,4),%rbx
add    %rdi,%rbx
jmp    *%rbx
movzbl (%rsi),%eax
mov    %eax,%ebx
and    $0xf8,%bl
cmp    $0x30,%bl
jne    11b4 <esc_decode+0xa4>
lea    (%rax,%rdx,8),%eax
add    $0xffffffd0,%eax
lea    0x3(%r14),%rsi
movzbl 0x3(%r14),%edx
mov    %rsi,(%rcx)
mov    %edx,%ebx
and    $0xf8,%bl
cmp    $0x30,%bl
jne    11ac <esc_decode+0x9c>
lea    (%rdx,%rax,8),%eax
add    $0xd0,%eax
add    $0x4,%r14
mov    %r14,(%rcx)
movzbl %al,%eax
jmp    11ac <esc_decode+0x9c>
mov    %r14,(%rcx)
mov    $0xffffffff,%eax
jmp    11ac <esc_decode+0x9c>
add    $0x1,%r14
mov    %r14,(%rcx)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
mov    %edx,%eax
jmp    11ac <esc_decode+0x9c>
cmpb   $0x0,(%rsi)
je     1274 <esc_decode+0x164>
lea    0x3(%r14),%rax
mov    %rax,(%rcx)
movzbl 0x2(%r14),%eax
jmp    11ac <esc_decode+0x9c>
mov    $0x8,%eax
jmp    11ac <esc_decode+0x9c>
mov    $0xc,%eax
jmp    11ac <esc_decode+0x9c>
mov    $0xa,%eax
jmp    11ac <esc_decode+0x9c>
mov    $0xd,%eax
jmp    11ac <esc_decode+0x9c>
mov    $0x9,%eax
jmp    11ac <esc_decode+0x9c>
mov    $0xb,%eax
jmp    11ac <esc_decode+0x9c>
movsbl (%rsi),%esi
lea    -0x30(%rsi),%eax
mov    $0xffffffd0,%edx
mov    $0xffffffd0,%edi
cmp    $0xa,%al
jb     122b <esc_decode+0x11b>
lea    -0x61(%rsi),%eax
mov    $0xffffffa9,%edi
cmp    $0x6,%al
jb     122b <esc_decode+0x11b>
lea    -0x41(%rsi),%ebx
mov    $0x78,%eax
mov    $0xffffffc9,%edi
cmp    $0x5,%bl
ja     11ac <esc_decode+0x9c>
mov    %edi,%eax
add    %esi,%eax
lea    0x3(%r14),%rdi
movsbl 0x3(%r14),%esi
mov    %rdi,(%rcx)
lea    -0x30(%rsi),%edi
cmp    $0xa,%dil
jb     1264 <esc_decode+0x154>
lea    -0x61(%rsi),%edi
mov    $0xffffffa9,%edx
cmp    $0x6,%dil
jb     1264 <esc_decode+0x154>
lea    -0x41(%rsi),%edi
mov    $0xffffffc9,%edx
cmp    $0x5,%dil
ja     11ac <esc_decode+0x9c>
shl    $0x4,%eax
add    %edx,%eax
add    %esi,%eax
add    $0x4,%r14
jmp    11a9 <esc_decode+0x99>
mov    $0x5c,%eax
jmp    11ac <esc_decode+0x9c>

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

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