int CcsUnescapeCh(const char **str, const char *stop) {
  int val;
  const char *cur = *str;
  if (cur >= stop)
    return -1;
  if ((val = *cur++) != '\\') {
    *str = cur;
    return val;
  }
  if (cur >= stop)
    return -2;
  switch (*cur) {
  case 'a':
    *str = cur + 1;
    return '\a';
  case 'b':
    *str = cur + 1;
    return '\b';
  case 'f':
    *str = cur + 1;
    return '\f';
  case 'n':
    *str = cur + 1;
    return '\n';
  case 'r':
    *str = cur + 1;
    return '\r';
  case 't':
    *str = cur + 1;
    return '\t';
  case 'v':
    *str = cur + 1;
    return '\v';
  case '\\':
    *str = cur + 1;
    return '\\';
  case '\'':
    *str = cur + 1;
    return '\'';
  case '\"':
    *str = cur + 1;
    return '\"';
  case '0':
  case '1':
  case '2':
  case '3':
    if (cur + 3 >= stop)
      return -2;
    if (cur[1] < '0' || cur[1] > '7')
      return -2;
    if (cur[2] < '0' || cur[2] > '7')
      return -2;
    *str = cur + 3;
    return ((cur[0] - '0') << 6) | ((cur[1] - '0') << 3) | (cur[0] - '0');
  case 'x':
    if (cur + 3 >= stop)
      return -2;
    val = 0;
    if (cur[1] >= '0' && cur[1] <= '9')
      val = ((cur[1] - '0') << 4);
    else if (cur[1] >= 'A' && cur[1] <= 'F')
      val = ((cur[1] - 'A' + 10) << 4);
    else if (cur[1] >= 'a' && cur[1] <= 'f')
      val = ((cur[1] - 'a' + 10) << 4);
    else
      return -2;
    if (cur[2] >= '0' && cur[2] <= '9')
      val |= cur[2] - '0';
    else if (cur[2] >= 'A' && cur[2] <= 'F')
      val |= cur[2] - 'A' + 10;
    else if (cur[2] >= 'a' && cur[2] <= 'f')
      val |= cur[2] - 'a' + 10;
    else
      return -2;
    *str = cur + 3;
    return val;
  default:
    break;
  }
  return -2;
}


x86 assembly (clang, -O0):
<CcsUnescapeCh>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jb     1131 <CcsUnescapeCh+0x31>
movl   $0xffffffff,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x1c(%rbp)
cmp    $0x5c,%eax
je     1165 <CcsUnescapeCh+0x65>
mov    -0x28(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jb     117f <CcsUnescapeCh+0x7f>
movl   $0xfffffffe,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
add    $0xffffffde,%eax
mov    %eax,%ecx
mov    %rcx,-0x30(%rbp)
sub    $0x56,%eax
ja     153b <CcsUnescapeCh+0x43b>
mov    -0x30(%rbp),%rax
lea    0xe5d(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x7,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x8,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0xc,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0xa,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0xd,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x9,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0xb,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x5c,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x27,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x22,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rax
add    $0x3,%rax
cmp    -0x18(%rbp),%rax
jb     12d8 <CcsUnescapeCh+0x1d8>
movl   $0xfffffffe,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     12fa <CcsUnescapeCh+0x1fa>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x37,%eax
jle    1306 <CcsUnescapeCh+0x206>
movl   $0xfffffffe,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x30,%eax
jl     1328 <CcsUnescapeCh+0x228>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x37,%eax
jle    1334 <CcsUnescapeCh+0x234>
movl   $0xfffffffe,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rcx
add    $0x3,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
shl    $0x6,%eax
mov    -0x28(%rbp),%rcx
movsbl 0x1(%rcx),%ecx
sub    $0x30,%ecx
shl    $0x3,%ecx
or     %ecx,%eax
mov    -0x28(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
or     %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
mov    -0x28(%rbp),%rax
add    $0x3,%rax
cmp    -0x18(%rbp),%rax
jb     1392 <CcsUnescapeCh+0x292>
movl   $0xfffffffe,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
movl   $0x0,-0x1c(%rbp)
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     13d1 <CcsUnescapeCh+0x2d1>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x39,%eax
jg     13d1 <CcsUnescapeCh+0x2d1>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x30,%eax
shl    $0x4,%eax
mov    %eax,-0x1c(%rbp)
jmp    145d <CcsUnescapeCh+0x35d>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x41,%eax
jl     140c <CcsUnescapeCh+0x30c>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x46,%eax
jg     140c <CcsUnescapeCh+0x30c>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x41,%eax
add    $0xa,%eax
shl    $0x4,%eax
mov    %eax,-0x1c(%rbp)
jmp    1458 <CcsUnescapeCh+0x358>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x61,%eax
jl     1447 <CcsUnescapeCh+0x347>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x66,%eax
jg     1447 <CcsUnescapeCh+0x347>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
sub    $0x61,%eax
add    $0xa,%eax
shl    $0x4,%eax
mov    %eax,-0x1c(%rbp)
jmp    1453 <CcsUnescapeCh+0x353>
movl   $0xfffffffe,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
jmp    1458 <CcsUnescapeCh+0x358>
jmp    145d <CcsUnescapeCh+0x35d>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x30,%eax
jl     1495 <CcsUnescapeCh+0x395>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x39,%eax
jg     1495 <CcsUnescapeCh+0x395>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x30,%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1521 <CcsUnescapeCh+0x421>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x41,%eax
jl     14d0 <CcsUnescapeCh+0x3d0>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x46,%eax
jg     14d0 <CcsUnescapeCh+0x3d0>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x41,%eax
add    $0xa,%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    151c <CcsUnescapeCh+0x41c>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x61,%eax
jl     150b <CcsUnescapeCh+0x40b>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x66,%eax
jg     150b <CcsUnescapeCh+0x40b>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
sub    $0x61,%eax
add    $0xa,%eax
or     -0x1c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1517 <CcsUnescapeCh+0x417>
movl   $0xfffffffe,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
jmp    151c <CcsUnescapeCh+0x41c>
jmp    1521 <CcsUnescapeCh+0x421>
mov    -0x28(%rbp),%rcx
add    $0x3,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1547 <CcsUnescapeCh+0x447>
jmp    1540 <CcsUnescapeCh+0x440>
movl   $0xfffffffe,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<CcsUnescapeCh>:
mov    (%rdi),%rcx
mov    $0xffffffff,%eax
cmp    %rsi,%rcx
jae    128e <CcsUnescapeCh+0x18e>
lea    0x1(%rcx),%rdx
movsbl (%rcx),%eax
cmp    $0x5c,%eax
jne    1192 <CcsUnescapeCh+0x92>
mov    $0xfffffffe,%eax
cmp    %rsi,%rdx
jae    128e <CcsUnescapeCh+0x18e>
movsbl (%rdx),%edx
add    $0xffffffde,%edx
cmp    $0x56,%edx
ja     128e <CcsUnescapeCh+0x18e>
lea    0xebf(%rip),%r8
movslq (%r8,%rdx,4),%rdx
add    %r8,%rdx
jmp    *%rdx
lea    0x4(%rcx),%r8
cmp    %rsi,%r8
jae    128e <CcsUnescapeCh+0x18e>
mov    0x2(%rcx),%dl
add    $0xc8,%dl
cmp    $0xf8,%dl
jb     128e <CcsUnescapeCh+0x18e>
mov    0x3(%rcx),%dl
add    $0xc8,%dl
cmp    $0xf8,%dl
jb     128e <CcsUnescapeCh+0x18e>
mov    %r8,(%rdi)
movsbl 0x1(%rcx),%edx
add    $0xffffffd0,%edx
movsbl 0x2(%rcx),%eax
lea    -0x180(,%rax,8),%eax
or     %edx,%eax
shl    $0x6,%edx
or     %edx,%eax
ret
mov    %rdx,(%rdi)
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0x22,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0x27,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0x5c,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0x7,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0x8,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0xc,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0xa,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0xd,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0x9,%eax
ret
add    $0x2,%rcx
mov    %rcx,(%rdi)
mov    $0xb,%eax
ret
lea    0x4(%rcx),%r9
cmp    %rsi,%r9
jae    128e <CcsUnescapeCh+0x18e>
movsbl 0x2(%rcx),%esi
lea    -0x30(%rsi),%edx
mov    $0xfffffd00,%r8d
cmp    $0xa,%dl
jb     124f <CcsUnescapeCh+0x14f>
lea    -0x41(%rsi),%edx
mov    $0xfffffc90,%r8d
cmp    $0x6,%dl
jb     124f <CcsUnescapeCh+0x14f>
lea    -0x61(%rsi),%edx
mov    $0xfffffa90,%r8d
cmp    $0x5,%dl
ja     128e <CcsUnescapeCh+0x18e>
movsbl 0x3(%rcx),%r10d
lea    -0x30(%r10),%ecx
mov    $0xffffffd0,%edx
cmp    $0xa,%cl
jb     127e <CcsUnescapeCh+0x17e>
lea    -0x41(%r10),%ecx
mov    $0xffffffc9,%edx
cmp    $0x6,%cl
jb     127e <CcsUnescapeCh+0x17e>
lea    -0x61(%r10),%ecx
mov    $0xffffffa9,%edx
cmp    $0x5,%cl
ja     128e <CcsUnescapeCh+0x18e>
shl    $0x4,%esi
add    %r8d,%esi
add    %r10d,%edx
or     %esi,%edx
mov    %r9,(%rdi)
mov    %edx,%eax
ret

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

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