int json_emit_quoted_str(char *buf, int buf_len, const char *str) {
  int i = 0, j = 0, ch;
  if (buf_len <= 1)
    return 0;
  do {
    if (j < buf_len)
      buf[j++] = '"';
  } while (0);
  while ((ch = str[i++]) != '\0' && j < buf_len) {
    switch (ch) {
    case '"':
      do {
        if (j < buf_len)
          buf[j++] = '\\';
      } while (0);
      do {
        if (j < buf_len)
          buf[j++] = '"';
      } while (0);
      break;
    case '\\':
      do {
        if (j < buf_len)
          buf[j++] = '\\';
      } while (0);
      do {
        if (j < buf_len)
          buf[j++] = '\\';
      } while (0);
      break;
    case '\b':
      do {
        if (j < buf_len)
          buf[j++] = '\\';
      } while (0);
      do {
        if (j < buf_len)
          buf[j++] = 'b';
      } while (0);
      break;
    case '\f':
      do {
        if (j < buf_len)
          buf[j++] = '\\';
      } while (0);
      do {
        if (j < buf_len)
          buf[j++] = 'f';
      } while (0);
      break;
    case '\n':
      do {
        if (j < buf_len)
          buf[j++] = '\\';
      } while (0);
      do {
        if (j < buf_len)
          buf[j++] = 'n';
      } while (0);
      break;
    case '\r':
      do {
        if (j < buf_len)
          buf[j++] = '\\';
      } while (0);
      do {
        if (j < buf_len)
          buf[j++] = 'r';
      } while (0);
      break;
    case '\t':
      do {
        if (j < buf_len)
          buf[j++] = '\\';
      } while (0);
      do {
        if (j < buf_len)
          buf[j++] = 't';
      } while (0);
      break;
    default:
      do {
        if (j < buf_len)
          buf[j++] = ch;
      } while (0);
    }
  }
  do {
    if (j < buf_len)
      buf[j++] = '"';
  } while (0);
  do {
    if (j < buf_len)
      buf[j++] = 0;
  } while (0);
  return j == 0 ? 0 : j - 1;
}


x86 assembly (clang, -O0):
<json_emit_quoted_str>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
cmpl   $0x1,-0x14(%rbp)
jg     1133 <json_emit_quoted_str+0x33>
movl   $0x0,-0x4(%rbp)
jmp    1561 <json_emit_quoted_str+0x461>
jmp    1138 <json_emit_quoted_str+0x38>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    115a <json_emit_quoted_str+0x5a>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x22,(%rax,%rcx,1)
jmp    115f <json_emit_quoted_str+0x5f>
jmp    1164 <json_emit_quoted_str+0x64>
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x24(%rbp)
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%ecx
mov    %ecx,-0x2c(%rbp)
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x2d(%rbp)
je     1197 <json_emit_quoted_str+0x97>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
setl   %al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
test   $0x1,%al
jne    11a7 <json_emit_quoted_str+0xa7>
jmp    14e6 <json_emit_quoted_str+0x3e6>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x34(%rbp)
sub    $0x8,%eax
je     12db <json_emit_quoted_str+0x1db>
jmp    11bb <json_emit_quoted_str+0xbb>
mov    -0x34(%rbp),%eax
sub    $0x9,%eax
je     144f <json_emit_quoted_str+0x34f>
jmp    11cc <json_emit_quoted_str+0xcc>
mov    -0x34(%rbp),%eax
sub    $0xa,%eax
je     1395 <json_emit_quoted_str+0x295>
jmp    11dd <json_emit_quoted_str+0xdd>
mov    -0x34(%rbp),%eax
sub    $0xc,%eax
je     1338 <json_emit_quoted_str+0x238>
jmp    11ee <json_emit_quoted_str+0xee>
mov    -0x34(%rbp),%eax
sub    $0xd,%eax
je     13f2 <json_emit_quoted_str+0x2f2>
jmp    11ff <json_emit_quoted_str+0xff>
mov    -0x34(%rbp),%eax
sub    $0x22,%eax
je     1221 <json_emit_quoted_str+0x121>
jmp    1210 <json_emit_quoted_str+0x110>
mov    -0x34(%rbp),%eax
sub    $0x5c,%eax
je     127e <json_emit_quoted_str+0x17e>
jmp    14ac <json_emit_quoted_str+0x3ac>
jmp    1226 <json_emit_quoted_str+0x126>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1248 <json_emit_quoted_str+0x148>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    124d <json_emit_quoted_str+0x14d>
jmp    1252 <json_emit_quoted_str+0x152>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1274 <json_emit_quoted_str+0x174>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x22,(%rax,%rcx,1)
jmp    1279 <json_emit_quoted_str+0x179>
jmp    14e1 <json_emit_quoted_str+0x3e1>
jmp    1283 <json_emit_quoted_str+0x183>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12a5 <json_emit_quoted_str+0x1a5>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    12aa <json_emit_quoted_str+0x1aa>
jmp    12af <json_emit_quoted_str+0x1af>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12d1 <json_emit_quoted_str+0x1d1>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    12d6 <json_emit_quoted_str+0x1d6>
jmp    14e1 <json_emit_quoted_str+0x3e1>
jmp    12e0 <json_emit_quoted_str+0x1e0>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1302 <json_emit_quoted_str+0x202>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    1307 <json_emit_quoted_str+0x207>
jmp    130c <json_emit_quoted_str+0x20c>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    132e <json_emit_quoted_str+0x22e>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x62,(%rax,%rcx,1)
jmp    1333 <json_emit_quoted_str+0x233>
jmp    14e1 <json_emit_quoted_str+0x3e1>
jmp    133d <json_emit_quoted_str+0x23d>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    135f <json_emit_quoted_str+0x25f>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    1364 <json_emit_quoted_str+0x264>
jmp    1369 <json_emit_quoted_str+0x269>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    138b <json_emit_quoted_str+0x28b>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x66,(%rax,%rcx,1)
jmp    1390 <json_emit_quoted_str+0x290>
jmp    14e1 <json_emit_quoted_str+0x3e1>
jmp    139a <json_emit_quoted_str+0x29a>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13bc <json_emit_quoted_str+0x2bc>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    13c1 <json_emit_quoted_str+0x2c1>
jmp    13c6 <json_emit_quoted_str+0x2c6>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13e8 <json_emit_quoted_str+0x2e8>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x6e,(%rax,%rcx,1)
jmp    13ed <json_emit_quoted_str+0x2ed>
jmp    14e1 <json_emit_quoted_str+0x3e1>
jmp    13f7 <json_emit_quoted_str+0x2f7>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1419 <json_emit_quoted_str+0x319>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    141e <json_emit_quoted_str+0x31e>
jmp    1423 <json_emit_quoted_str+0x323>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1445 <json_emit_quoted_str+0x345>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x72,(%rax,%rcx,1)
jmp    144a <json_emit_quoted_str+0x34a>
jmp    14e1 <json_emit_quoted_str+0x3e1>
jmp    1454 <json_emit_quoted_str+0x354>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1476 <json_emit_quoted_str+0x376>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    147b <json_emit_quoted_str+0x37b>
jmp    1480 <json_emit_quoted_str+0x380>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    14a2 <json_emit_quoted_str+0x3a2>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x74,(%rax,%rcx,1)
jmp    14a7 <json_emit_quoted_str+0x3a7>
jmp    14e1 <json_emit_quoted_str+0x3e1>
jmp    14b1 <json_emit_quoted_str+0x3b1>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    14d7 <json_emit_quoted_str+0x3d7>
mov    -0x2c(%rbp),%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    14dc <json_emit_quoted_str+0x3dc>
jmp    14e1 <json_emit_quoted_str+0x3e1>
jmp    1164 <json_emit_quoted_str+0x64>
jmp    14eb <json_emit_quoted_str+0x3eb>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    150d <json_emit_quoted_str+0x40d>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x22,(%rax,%rcx,1)
jmp    1512 <json_emit_quoted_str+0x412>
jmp    1517 <json_emit_quoted_str+0x417>
mov    -0x28(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1539 <json_emit_quoted_str+0x439>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    153e <json_emit_quoted_str+0x43e>
cmpl   $0x0,-0x28(%rbp)
jne    1552 <json_emit_quoted_str+0x452>
xor    %eax,%eax
mov    %eax,-0x38(%rbp)
jmp    155b <json_emit_quoted_str+0x45b>
mov    -0x28(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<json_emit_quoted_str>:
xor    %eax,%eax
cmp    $0x2,%esi
jl     1253 <json_emit_quoted_str+0x153>
push   %rbx
movb   $0x22,(%rdi)
mov    (%rdx),%r11b
test   %r11b,%r11b
je     1254 <json_emit_quoted_str+0x154>
add    $0x1,%rdx
mov    $0x1,%eax
lea    0xed5(%rip),%r8
nopl   0x0(%rax,%rax,1)
movsbl %r11b,%ebx
lea    -0x8(%rbx),%ecx
cmp    $0x1a,%ecx
ja     116a <json_emit_quoted_str+0x6a>
movslq (%r8,%rcx,4),%rcx
add    %r8,%rcx
mov    $0x1,%r10d
mov    %eax,%r9d
jmp    *%rcx
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1220 <json_emit_quoted_str+0x120>
mov    $0x62,%r11b
jmp    1200 <json_emit_quoted_str+0x100>
mov    $0x1,%r10d
mov    %eax,%r9d
cmp    $0x5c,%ebx
jne    1206 <json_emit_quoted_str+0x106>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1220 <json_emit_quoted_str+0x120>
mov    $0x5c,%r11b
jmp    1200 <json_emit_quoted_str+0x100>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1220 <json_emit_quoted_str+0x120>
mov    $0x74,%r11b
jmp    1200 <json_emit_quoted_str+0x100>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1220 <json_emit_quoted_str+0x120>
mov    $0x6e,%r11b
jmp    1200 <json_emit_quoted_str+0x100>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1220 <json_emit_quoted_str+0x120>
mov    $0x66,%r11b
jmp    1200 <json_emit_quoted_str+0x100>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1220 <json_emit_quoted_str+0x120>
mov    $0x72,%r11b
jmp    1200 <json_emit_quoted_str+0x100>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1220 <json_emit_quoted_str+0x120>
mov    $0x22,%r11b
nopl   0x0(%rax)
mov    $0x2,%r10d
add    %r10d,%eax
movslq %r9d,%rcx
mov    %r11b,(%rdi,%rcx,1)
jmp    1223 <json_emit_quoted_str+0x123>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r9d,%eax
movzbl (%rdx),%r11d
test   %r11b,%r11b
je     1238 <json_emit_quoted_str+0x138>
add    $0x1,%rdx
cmp    %esi,%eax
jl     1130 <json_emit_quoted_str+0x30>
cmp    %esi,%eax
jl     1259 <json_emit_quoted_str+0x159>
cmp    %esi,%eax
jge    124a <json_emit_quoted_str+0x14a>
movslq %eax,%rcx
add    $0x1,%eax
movb   $0x0,(%rdi,%rcx,1)
xor    %ecx,%ecx
sub    $0x1,%eax
cmovb  %ecx,%eax
pop    %rbx
ret
mov    $0x1,%eax
movslq %eax,%rcx
add    $0x1,%eax
movb   $0x22,(%rdi,%rcx,1)
cmp    %esi,%eax
jl     1240 <json_emit_quoted_str+0x140>
jmp    124a <json_emit_quoted_str+0x14a>

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

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