#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 */
char *malloc(int);
unsigned int strtol(char const *, char **, int);
char *json_decode_string(const char **input) {
  const char *c, *end;
  unsigned int ch;
  char *result, *o;
  c = *input;
  if (*c != '"')
    return 0;
  end = ++c;
  while (*end && *end != '"') {
    if (*end == '\\' && *(end + 1))
      end += 2;
    else
      ++end;
  }
  result = malloc(end - c + 1);
  if (!result)
    return 0;
  o = result;
  ch = 0;
  while (c != end) {
    switch (*c) {
    case '\\':
      ++c;
      switch (*c++) {
      case '0':
        ch = strtol(c, (char **)&c, 8);
        break;
      case '"':
        ch = '"';
        break;
      case '/':
        ch = '/';
        break;
      case 'a':
        ch = '\a';
        break;
      case 'b':
        ch = '\b';
        break;
      case 't':
        ch = '\t';
        break;
      case 'n':
        ch = '\n';
        break;
      case 'v':
        ch = '\v';
        break;
      case 'f':
        ch = '\f';
        break;
      case 'r':
        ch = '\r';
        break;
      case 'u':
        ch = strtol(c, (char **)&c, 16);
        break;
      case '\\':
        ch = '\\';
        break;
      default:
        break;
      }
      if (ch < 0x80)
        *o++ = (ch);
      else if (ch < 0x800) {
        *o++ = (0xc0 | (ch >> 6));
        *o++ = (0x80 | (ch & 0x3f));
      } else if (ch < 0x10000) {
        *o++ = (0xe0 | (ch >> 12));
        *o++ = (0x80 | ((ch >> 6) & 0x3f));
        *o++ = (0x80 | (ch & 0x3f));
      } else if (ch < 0x200000) {
        *o++ = (0xf0 | (ch >> 18));
        *o++ = (0x80 | ((ch >> 12) & 0x3f));
        *o++ = (0x80 | ((ch >> 6) & 0x3f));
        *o++ = (0x80 | (ch & 0x3f));
      } else if (ch < 0x4000000) {
        *o++ = (0xf8 | (ch >> 24));
        *o++ = (0x80 | ((ch >> 18) & 0x3f));
        *o++ = (0x80 | ((ch >> 12) & 0x3f));
        *o++ = (0x80 | ((ch >> 6) & 0x3f));
        *o++ = (0x80 | (ch & 0x3f));
      } else {
        *o++ = (0xfc | (ch >> 30));
        *o++ = (0x80 | ((ch >> 24) & 0x3f));
        *o++ = (0x80 | ((ch >> 18) & 0x3f));
        *o++ = (0x80 | ((ch >> 12) & 0x3f));
        *o++ = (0x80 | ((ch >> 6) & 0x3f));
        *o++ = (0x80 | (ch & 0x3f));
      }
      break;
    default:
      *o++ = *c++;
    }
  }
  if (*c == '"')
    ++c;
  *o = 0;
  *input = c;
  return result;
}


x86 assembly (clang, -O0):
<json_decode_string>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
je     1154 <json_decode_string+0x34>
movq   $0x0,-0x8(%rbp)
jmp    168f <json_decode_string+0x56f>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x39(%rbp)
je     1189 <json_decode_string+0x69>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
setne  %al
mov    %al,-0x39(%rbp)
mov    -0x39(%rbp),%al
test   $0x1,%al
jne    1199 <json_decode_string+0x79>
jmp    11dc <json_decode_string+0xbc>
mov    -0x20(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    11cb <json_decode_string+0xab>
mov    -0x20(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
je     11cb <json_decode_string+0xab>
mov    -0x20(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x20(%rbp)
jmp    11d7 <json_decode_string+0xb7>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1164 <json_decode_string+0x44>
mov    -0x20(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    %rcx,%rax
add    $0x1,%rax
mov    %eax,%edi
call   1040 <malloc@plt>
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jne    120e <json_decode_string+0xee>
movq   $0x0,-0x8(%rbp)
jmp    168f <json_decode_string+0x56f>
mov    -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
je     1659 <json_decode_string+0x539>
mov    -0x18(%rbp),%rax
mov    (%rax),%al
sub    $0x5c,%al
jne    1632 <json_decode_string+0x512>
jmp    123e <json_decode_string+0x11e>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
add    $0xffffffde,%eax
mov    %eax,%ecx
mov    %rcx,-0x48(%rbp)
sub    $0x54,%eax
ja     132e <json_decode_string+0x20e>
mov    -0x48(%rbp),%rax
lea    0xd87(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x18(%rbp),%rdi
lea    -0x18(%rbp),%rsi
mov    $0x8,%edx
call   1030 <strtol@plt>
mov    %eax,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0x22,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0x2f,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0x7,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0x8,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0x9,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0xa,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0xb,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0xc,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0xd,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
mov    -0x18(%rbp),%rdi
lea    -0x18(%rbp),%rsi
mov    $0x10,%edx
call   1030 <strtol@plt>
mov    %eax,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
movl   $0x5c,-0x24(%rbp)
jmp    1333 <json_decode_string+0x213>
jmp    1333 <json_decode_string+0x213>
cmpl   $0x80,-0x24(%rbp)
jae    135b <json_decode_string+0x23b>
mov    -0x24(%rbp),%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    162d <json_decode_string+0x50d>
cmpl   $0x800,-0x24(%rbp)
jae    13a9 <json_decode_string+0x289>
mov    -0x24(%rbp),%eax
shr    $0x6,%eax
or     $0xc0,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    1628 <json_decode_string+0x508>
cmpl   $0x10000,-0x24(%rbp)
jae    1418 <json_decode_string+0x2f8>
mov    -0x24(%rbp),%eax
shr    $0xc,%eax
or     $0xe0,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    1623 <json_decode_string+0x503>
cmpl   $0x200000,-0x24(%rbp)
jae    14a8 <json_decode_string+0x388>
mov    -0x24(%rbp),%eax
shr    $0x12,%eax
or     $0xf0,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0xc,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    161e <json_decode_string+0x4fe>
cmpl   $0x4000000,-0x24(%rbp)
jae    1559 <json_decode_string+0x439>
mov    -0x24(%rbp),%eax
shr    $0x18,%eax
or     $0xf8,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0x12,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0xc,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    1619 <json_decode_string+0x4f9>
mov    -0x24(%rbp),%eax
shr    $0x1e,%eax
or     $0xfc,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0x18,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0x12,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0xc,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
shr    $0x6,%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
mov    -0x24(%rbp),%eax
and    $0x3f,%eax
or     $0x80,%eax
mov    %al,%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    161e <json_decode_string+0x4fe>
jmp    1623 <json_decode_string+0x503>
jmp    1628 <json_decode_string+0x508>
jmp    162d <json_decode_string+0x50d>
jmp    1654 <json_decode_string+0x534>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%cl
mov    -0x38(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x38(%rbp)
mov    %cl,(%rax)
jmp    121d <json_decode_string+0xfd>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x22,%eax
jne    1675 <json_decode_string+0x555>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x38(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<json_decode_string>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    (%rdi),%rax
cmpb   $0x22,(%rax)
jne    11a6 <json_decode_string+0x86>
mov    %rdi,%r14
lea    0x1(%rax),%r13
mov    %r13,(%rsp)
mov    $0x1,%ebx
jmp    1158 <json_decode_string+0x38>
cs nopw 0x0(%rax,%rax,1)
nop
mov    $0x1,%ecx
add    %rcx,%rbx
lea    (%rax,%rbx,1),%r15
movzbl (%rax,%rbx,1),%ecx
cmp    $0x5c,%cl
je     1170 <json_decode_string+0x50>
test   %cl,%cl
je     117e <json_decode_string+0x5e>
cmp    $0x22,%cl
jne    1150 <json_decode_string+0x30>
jmp    117e <json_decode_string+0x5e>
mov    $0x2,%ecx
cmpb   $0x0,0x1(%r15)
jne    1155 <json_decode_string+0x35>
jmp    1150 <json_decode_string+0x30>
mov    %ebx,%edi
call   1040 <malloc@plt>
test   %rax,%rax
je     11a6 <json_decode_string+0x86>
mov    %rax,%r12
cmp    $0x1,%rbx
jne    11ae <json_decode_string+0x8e>
mov    %r12,%rbx
cmpb   $0x22,0x0(%r13)
je     13a8 <json_decode_string+0x288>
jmp    13b0 <json_decode_string+0x290>
xor    %r12d,%r12d
jmp    13ba <json_decode_string+0x29a>
xor    %eax,%eax
lea    0xe49(%rip),%rbp
mov    %r12,%rbx
jmp    11db <json_decode_string+0xbb>
nopl   0x0(%rax)
add    $0x1,%r13
mov    %r13,(%rsp)
mov    %cl,(%rbx)
add    $0x1,%rbx
mov    (%rsp),%r13
cmp    %r15,%r13
je     139e <json_decode_string+0x27e>
movzbl 0x0(%r13),%ecx
cmp    $0x5c,%cl
jne    11c0 <json_decode_string+0xa0>
lea    0x2(%r13),%rdi
mov    %rdi,(%rsp)
movsbl 0x1(%r13),%ecx
lea    -0x22(%rcx),%esi
cmp    $0x54,%esi
ja     1240 <json_decode_string+0x120>
mov    $0x8,%edx
movslq 0x0(%rbp,%rsi,4),%rsi
add    %rbp,%rsi
jmp    *%rsi
mov    $0x7,%ecx
jmp    1280 <json_decode_string+0x160>
mov    $0x8,%ecx
jmp    1280 <json_decode_string+0x160>
mov    $0xc,%ecx
jmp    1280 <json_decode_string+0x160>
mov    $0xa,%ecx
jmp    1280 <json_decode_string+0x160>
mov    $0xd,%ecx
jmp    1280 <json_decode_string+0x160>
mov    $0x9,%ecx
jmp    1280 <json_decode_string+0x160>
mov    $0x10,%edx
mov    %rsp,%rsi
call   1030 <strtol@plt>
cmp    $0x7f,%eax
ja     1249 <json_decode_string+0x129>
mov    %eax,%ecx
jmp    1280 <json_decode_string+0x160>
mov    %eax,%ecx
cmp    $0x7ff,%eax
ja     128d <json_decode_string+0x16d>
shr    $0x6,%ecx
or     $0xc0,%cl
mov    %cl,(%rbx)
mov    %eax,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x1(%rbx)
add    $0x2,%rbx
jmp    11ce <json_decode_string+0xae>
mov    $0xb,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %cl,(%rbx)
add    $0x1,%rbx
mov    %ecx,%eax
jmp    11ce <json_decode_string+0xae>
cmp    $0xffff,%eax
ja     12be <json_decode_string+0x19e>
shr    $0xc,%ecx
or     $0xe0,%cl
mov    %cl,(%rbx)
mov    %eax,%ecx
shr    $0x6,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x1(%rbx)
mov    %eax,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x2(%rbx)
add    $0x3,%rbx
jmp    11ce <json_decode_string+0xae>
cmp    $0x1fffff,%eax
ja     12fd <json_decode_string+0x1dd>
shr    $0x12,%ecx
or     $0xf0,%cl
mov    %cl,(%rbx)
mov    %eax,%ecx
shr    $0xc,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x1(%rbx)
mov    %eax,%ecx
shr    $0x6,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x2(%rbx)
mov    %eax,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x3(%rbx)
add    $0x4,%rbx
jmp    11ce <json_decode_string+0xae>
cmp    $0x3ffffff,%eax
ja     134a <json_decode_string+0x22a>
shr    $0x18,%ecx
or     $0xf8,%cl
mov    %cl,(%rbx)
mov    %eax,%ecx
shr    $0x12,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x1(%rbx)
mov    %eax,%ecx
shr    $0xc,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x2(%rbx)
mov    %eax,%ecx
shr    $0x6,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x3(%rbx)
mov    %eax,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x4(%rbx)
add    $0x5,%rbx
jmp    11ce <json_decode_string+0xae>
shr    $0x1e,%ecx
or     $0xfc,%cl
mov    %cl,(%rbx)
mov    %eax,%ecx
shr    $0x18,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x1(%rbx)
mov    %eax,%ecx
shr    $0x12,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x2(%rbx)
mov    %eax,%ecx
shr    $0xc,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x3(%rbx)
mov    %eax,%ecx
shr    $0x6,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x4(%rbx)
mov    %eax,%ecx
and    $0x3f,%cl
or     $0x80,%cl
mov    %cl,0x5(%rbx)
add    $0x6,%rbx
jmp    11ce <json_decode_string+0xae>
mov    %r15,%r13
cmpb   $0x22,0x0(%r13)
jne    13b0 <json_decode_string+0x290>
add    $0x1,%r13
mov    %r13,(%rsp)
movb   $0x0,(%rbx)
mov    (%rsp),%rax
mov    %rax,(%r14)
mov    %r12,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define i8* @json_decode_string(i8** nocapture %0) {
%2 = alloca i8*
%3 = bitcast i8** %2 to i8*
%4 = load i8*, i8** %0
%5 = load i8, i8* %4
%6 = icmp eq i8 %5, 34
br i1 %6, label %7, label %175
7: ; preds = %1
%8 = getelementptr inbounds i8, i8* %4, i64 1
store i8* %8, i8** %2
br label %9
9: ; preds = %18, %7
%10 = phi i64 [ 1, %7 ], [ %20, %18 ]
%11 = getelementptr inbounds i8, i8* %4, i64 %10
%12 = load i8, i8* %11
switch i8 %12, label %17 [
i8 0, label %21
i8 34, label %21
i8 92, label %13
]
13: ; preds = %9
%14 = getelementptr inbounds i8, i8* %11, i64 1
%15 = load i8, i8* %14
%16 = icmp eq i8 %15, 0
br i1 %16, label %17, label %18
17: ; preds = %9, %13
br label %18
18: ; preds = %13, %17
%19 = phi i64 [ 1, %17 ], [ 2, %13 ]
%20 = add nuw nsw i64 %10, %19
br label %9
21: ; preds = %9, %9
%22 = trunc i64 %10 to i32
%23 = tail call i8* @malloc(i32 %22)
%24 = icmp eq i8* %23, null
br i1 %24, label %175, label %25
25: ; preds = %21
%26 = icmp eq i64 %10, 1
br i1 %26, label %166, label %27
27: ; preds = %25, %161
%28 = phi i8* [ %164, %161 ], [ %8, %25 ]
%29 = phi i8* [ %163, %161 ], [ %23, %25 ]
%30 = phi i32 [ %162, %161 ], [ 0, %25 ]
%31 = load i8, i8* %28
%32 = icmp eq i8 %31, 92
%33 = getelementptr inbounds i8, i8* %28, i64 1
br i1 %32, label %34, label %159
34: ; preds = %27
%35 = getelementptr inbounds i8, i8* %28, i64 2
store i8* %35, i8** %2
%36 = load i8, i8* %33
%37 = sext i8 %36 to i32
switch i32 %37, label %49 [
i32 48, label %46
i32 34, label %52
i32 47, label %52
i32 97, label %38
i32 98, label %39
i32 116, label %40
i32 110, label %41
i32 118, label %42
i32 102, label %43
i32 114, label %44
i32 117, label %45
i32 92, label %52
]
38: ; preds = %34
br label %52
39: ; preds = %34
br label %52
40: ; preds = %34
br label %52
41: ; preds = %34
br label %52
42: ; preds = %34
br label %52
43: ; preds = %34
br label %52
44: ; preds = %34
br label %52
45: ; preds = %34
br label %46
46: ; preds = %34, %45
%47 = phi i32 [ 16, %45 ], [ 8, %34 ]
%48 = call i32 @strtol(i8* %35, i8** %2, i32 %47)
br label %49
49: ; preds = %46, %34
%50 = phi i32 [ %30, %34 ], [ %48, %46 ]
%51 = icmp ult i32 %50, 128
br i1 %51, label %52, label %56
52: ; preds = %34, %34, %34, %38, %39, %40, %41, %42, %43, %44, %49
%53 = phi i32 [ %50, %49 ], [ 7, %38 ], [ 8, %39 ], [ 9, %40 ], [ 10, %41 ], [ 11, %42 ], [ 12, %43 ], [ 13, %44 ], [ %37, %34 ], [ %37, %34 ], [ %37, %34 ]
%54 = trunc i32 %53 to i8
%55 = getelementptr inbounds i8, i8* %29, i64 1
store i8 %54, i8* %29
br label %161
56: ; preds = %49
%57 = icmp ult i32 %50, 2048
br i1 %57, label %58, label %67
58: ; preds = %56
%59 = lshr i32 %50, 6
%60 = trunc i32 %59 to i8
%61 = or i8 %60, -64
%62 = getelementptr inbounds i8, i8* %29, i64 1
store i8 %61, i8* %29
%63 = trunc i32 %50 to i8
%64 = and i8 %63, 63
%65 = or i8 %64, -128
%66 = getelementptr inbounds i8, i8* %29, i64 2
store i8 %65, i8* %62
br label %161
67: ; preds = %56
%68 = icmp ult i32 %50, 65536
br i1 %68, label %69, label %83
69: ; preds = %67
%70 = lshr i32 %50, 12
%71 = trunc i32 %70 to i8
%72 = or i8 %71, -32
%73 = getelementptr inbounds i8, i8* %29, i64 1
store i8 %72, i8* %29
%74 = lshr i32 %50, 6
%75 = trunc i32 %74 to i8
%76 = and i8 %75, 63
%77 = or i8 %76, -128
%78 = getelementptr inbounds i8, i8* %29, i64 2
store i8 %77, i8* %73
%79 = trunc i32 %50 to i8
%80 = and i8 %79, 63
%81 = or i8 %80, -128
%82 = getelementptr inbounds i8, i8* %29, i64 3
store i8 %81, i8* %78
br label %161
83: ; preds = %67
%84 = icmp ult i32 %50, 2097152
br i1 %84, label %85, label %104
85: ; preds = %83
%86 = lshr i32 %50, 18
%87 = trunc i32 %86 to i8
%88 = or i8 %87, -16
%89 = getelementptr inbounds i8, i8* %29, i64 1
store i8 %88, i8* %29
%90 = lshr i32 %50, 12
%91 = trunc i32 %90 to i8
%92 = and i8 %91, 63
%93 = or i8 %92, -128
%94 = getelementptr inbounds i8, i8* %29, i64 2
store i8 %93, i8* %89
%95 = lshr i32 %50, 6
%96 = trunc i32 %95 to i8
%97 = and i8 %96, 63
%98 = or i8 %97, -128
%99 = getelementptr inbounds i8, i8* %29, i64 3
store i8 %98, i8* %94
%100 = trunc i32 %50 to i8
%101 = and i8 %100, 63
%102 = or i8 %101, -128
%103 = getelementptr inbounds i8, i8* %29, i64 4
store i8 %102, i8* %99
br label %161
104: ; preds = %83
%105 = icmp ult i32 %50, 67108864
br i1 %105, label %106, label %130
106: ; preds = %104
%107 = lshr i32 %50, 24
%108 = trunc i32 %107 to i8
%109 = or i8 %108, -8
%110 = getelementptr inbounds i8, i8* %29, i64 1
store i8 %109, i8* %29
%111 = lshr i32 %50, 18
%112 = trunc i32 %111 to i8
%113 = and i8 %112, 63
%114 = or i8 %113, -128
%115 = getelementptr inbounds i8, i8* %29, i64 2
store i8 %114, i8* %110
%116 = lshr i32 %50, 12
%117 = trunc i32 %116 to i8
%118 = and i8 %117, 63
%119 = or i8 %118, -128
%120 = getelementptr inbounds i8, i8* %29, i64 3
store i8 %119, i8* %115
%121 = lshr i32 %50, 6
%122 = trunc i32 %121 to i8
%123 = and i8 %122, 63
%124 = or i8 %123, -128
%125 = getelementptr inbounds i8, i8* %29, i64 4
store i8 %124, i8* %120
%126 = trunc i32 %50 to i8
%127 = and i8 %126, 63
%128 = or i8 %127, -128
%129 = getelementptr inbounds i8, i8* %29, i64 5
store i8 %128, i8* %125
br label %161
130: ; preds = %104
%131 = lshr i32 %50, 30
%132 = trunc i32 %131 to i8
%133 = or i8 %132, -4
%134 = getelementptr inbounds i8, i8* %29, i64 1
store i8 %133, i8* %29
%135 = lshr i32 %50, 24
%136 = trunc i32 %135 to i8
%137 = and i8 %136, 63
%138 = or i8 %137, -128
%139 = getelementptr inbounds i8, i8* %29, i64 2
store i8 %138, i8* %134
%140 = lshr i32 %50, 18
%141 = trunc i32 %140 to i8
%142 = and i8 %141, 63
%143 = or i8 %142, -128
%144 = getelementptr inbounds i8, i8* %29, i64 3
store i8 %143, i8* %139
%145 = lshr i32 %50, 12
%146 = trunc i32 %145 to i8
%147 = and i8 %146, 63
%148 = or i8 %147, -128
%149 = getelementptr inbounds i8, i8* %29, i64 4
store i8 %148, i8* %144
%150 = lshr i32 %50, 6
%151 = trunc i32 %150 to i8
%152 = and i8 %151, 63
%153 = or i8 %152, -128
%154 = getelementptr inbounds i8, i8* %29, i64 5
store i8 %153, i8* %149
%155 = trunc i32 %50 to i8
%156 = and i8 %155, 63
%157 = or i8 %156, -128
%158 = getelementptr inbounds i8, i8* %29, i64 6
store i8 %157, i8* %154
br label %161
159: ; preds = %27
store i8* %33, i8** %2
%160 = getelementptr inbounds i8, i8* %29, i64 1
store i8 %31, i8* %29
br label %161
161: ; preds = %52, %69, %106, %130, %85, %58, %159
%162 = phi i32 [ %53, %52 ], [ %50, %58 ], [ %50, %69 ], [ %50, %85 ], [ %50, %106 ], [ %50, %130 ], [ %30, %159 ]
%163 = phi i8* [ %55, %52 ], [ %66, %58 ], [ %82, %69 ], [ %103, %85 ], [ %129, %106 ], [ %158, %130 ], [ %160, %159 ]
%164 = load i8*, i8** %2
%165 = icmp eq i8* %164, %11
br i1 %165, label %166, label %27
166: ; preds = %161, %25
%167 = phi i8* [ %23, %25 ], [ %163, %161 ]
%168 = phi i8* [ %8, %25 ], [ %11, %161 ]
%169 = load i8, i8* %168
%170 = icmp eq i8 %169, 34
br i1 %170, label %171, label %173
171: ; preds = %166
%172 = getelementptr inbounds i8, i8* %168, i64 1
store i8* %172, i8** %2
br label %173
173: ; preds = %171, %166
store i8 0, i8* %167
%174 = load i8*, i8** %2
store i8* %174, i8** %0
br label %175
175: ; preds = %21, %1, %173
%176 = phi i8* [ %23, %173 ], [ null, %1 ], [ null, %21 ]
ret i8* %176
}