int json_emit_quoted_str(char *buf, int buf_len, const char *str) {
  int i = 0, j = 0, ch;
  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,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    113f <json_emit_quoted_str+0x3f>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x22,(%rax,%rcx,1)
jmp    1144 <json_emit_quoted_str+0x44>
jmp    1149 <json_emit_quoted_str+0x49>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%ecx
mov    %ecx,-0x24(%rbp)
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x25(%rbp)
je     117c <json_emit_quoted_str+0x7c>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
setl   %al
mov    %al,-0x25(%rbp)
mov    -0x25(%rbp),%al
test   $0x1,%al
jne    118c <json_emit_quoted_str+0x8c>
jmp    14cb <json_emit_quoted_str+0x3cb>
mov    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
sub    $0x8,%eax
je     12c0 <json_emit_quoted_str+0x1c0>
jmp    11a0 <json_emit_quoted_str+0xa0>
mov    -0x2c(%rbp),%eax
sub    $0x9,%eax
je     1434 <json_emit_quoted_str+0x334>
jmp    11b1 <json_emit_quoted_str+0xb1>
mov    -0x2c(%rbp),%eax
sub    $0xa,%eax
je     137a <json_emit_quoted_str+0x27a>
jmp    11c2 <json_emit_quoted_str+0xc2>
mov    -0x2c(%rbp),%eax
sub    $0xc,%eax
je     131d <json_emit_quoted_str+0x21d>
jmp    11d3 <json_emit_quoted_str+0xd3>
mov    -0x2c(%rbp),%eax
sub    $0xd,%eax
je     13d7 <json_emit_quoted_str+0x2d7>
jmp    11e4 <json_emit_quoted_str+0xe4>
mov    -0x2c(%rbp),%eax
sub    $0x22,%eax
je     1206 <json_emit_quoted_str+0x106>
jmp    11f5 <json_emit_quoted_str+0xf5>
mov    -0x2c(%rbp),%eax
sub    $0x5c,%eax
je     1263 <json_emit_quoted_str+0x163>
jmp    1491 <json_emit_quoted_str+0x391>
jmp    120b <json_emit_quoted_str+0x10b>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    122d <json_emit_quoted_str+0x12d>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    1232 <json_emit_quoted_str+0x132>
jmp    1237 <json_emit_quoted_str+0x137>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1259 <json_emit_quoted_str+0x159>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x22,(%rax,%rcx,1)
jmp    125e <json_emit_quoted_str+0x15e>
jmp    14c6 <json_emit_quoted_str+0x3c6>
jmp    1268 <json_emit_quoted_str+0x168>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    128a <json_emit_quoted_str+0x18a>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    128f <json_emit_quoted_str+0x18f>
jmp    1294 <json_emit_quoted_str+0x194>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12b6 <json_emit_quoted_str+0x1b6>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    12bb <json_emit_quoted_str+0x1bb>
jmp    14c6 <json_emit_quoted_str+0x3c6>
jmp    12c5 <json_emit_quoted_str+0x1c5>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    12e7 <json_emit_quoted_str+0x1e7>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    12ec <json_emit_quoted_str+0x1ec>
jmp    12f1 <json_emit_quoted_str+0x1f1>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1313 <json_emit_quoted_str+0x213>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x62,(%rax,%rcx,1)
jmp    1318 <json_emit_quoted_str+0x218>
jmp    14c6 <json_emit_quoted_str+0x3c6>
jmp    1322 <json_emit_quoted_str+0x222>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1344 <json_emit_quoted_str+0x244>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    1349 <json_emit_quoted_str+0x249>
jmp    134e <json_emit_quoted_str+0x24e>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1370 <json_emit_quoted_str+0x270>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x66,(%rax,%rcx,1)
jmp    1375 <json_emit_quoted_str+0x275>
jmp    14c6 <json_emit_quoted_str+0x3c6>
jmp    137f <json_emit_quoted_str+0x27f>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    13a1 <json_emit_quoted_str+0x2a1>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    13a6 <json_emit_quoted_str+0x2a6>
jmp    13ab <json_emit_quoted_str+0x2ab>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    13cd <json_emit_quoted_str+0x2cd>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x6e,(%rax,%rcx,1)
jmp    13d2 <json_emit_quoted_str+0x2d2>
jmp    14c6 <json_emit_quoted_str+0x3c6>
jmp    13dc <json_emit_quoted_str+0x2dc>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    13fe <json_emit_quoted_str+0x2fe>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    1403 <json_emit_quoted_str+0x303>
jmp    1408 <json_emit_quoted_str+0x308>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    142a <json_emit_quoted_str+0x32a>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x72,(%rax,%rcx,1)
jmp    142f <json_emit_quoted_str+0x32f>
jmp    14c6 <json_emit_quoted_str+0x3c6>
jmp    1439 <json_emit_quoted_str+0x339>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    145b <json_emit_quoted_str+0x35b>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
jmp    1460 <json_emit_quoted_str+0x360>
jmp    1465 <json_emit_quoted_str+0x365>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1487 <json_emit_quoted_str+0x387>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x74,(%rax,%rcx,1)
jmp    148c <json_emit_quoted_str+0x38c>
jmp    14c6 <json_emit_quoted_str+0x3c6>
jmp    1496 <json_emit_quoted_str+0x396>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    14bc <json_emit_quoted_str+0x3bc>
mov    -0x24(%rbp),%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x20(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    14c1 <json_emit_quoted_str+0x3c1>
jmp    14c6 <json_emit_quoted_str+0x3c6>
jmp    1149 <json_emit_quoted_str+0x49>
jmp    14d0 <json_emit_quoted_str+0x3d0>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    14f2 <json_emit_quoted_str+0x3f2>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x22,(%rax,%rcx,1)
jmp    14f7 <json_emit_quoted_str+0x3f7>
jmp    14fc <json_emit_quoted_str+0x3fc>
mov    -0x20(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    151e <json_emit_quoted_str+0x41e>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x20(%rbp)
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1523 <json_emit_quoted_str+0x423>
cmpl   $0x0,-0x20(%rbp)
jne    1537 <json_emit_quoted_str+0x437>
xor    %eax,%eax
mov    %eax,-0x30(%rbp)
jmp    1540 <json_emit_quoted_str+0x440>
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<json_emit_quoted_str>:
push   %rbx
test   %esi,%esi
jle    110f <json_emit_quoted_str+0xf>
movb   $0x22,(%rdi)
mov    $0x1,%eax
jmp    1111 <json_emit_quoted_str+0x11>
xor    %eax,%eax
mov    (%rdx),%r11b
cmp    %esi,%eax
setl   %cl
test   %r11b,%r11b
je     124d <json_emit_quoted_str+0x14d>
cmp    %esi,%eax
jge    124d <json_emit_quoted_str+0x14d>
add    $0x1,%rdx
lea    0xecb(%rip),%r8
cs nopw 0x0(%rax,%rax,1)
nop
movsbl %r11b,%ebx
mov    $0x1,%r10d
lea    -0x8(%rbx),%ecx
cmp    $0x1a,%ecx
ja     117a <json_emit_quoted_str+0x7a>
movslq (%r8,%rcx,4),%rcx
add    %r8,%rcx
mov    %eax,%r9d
jmp    *%rcx
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1230 <json_emit_quoted_str+0x130>
mov    $0x62,%r11b
jmp    1210 <json_emit_quoted_str+0x110>
mov    %eax,%r9d
cmp    $0x5c,%ebx
jne    1216 <json_emit_quoted_str+0x116>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1230 <json_emit_quoted_str+0x130>
mov    $0x5c,%r11b
jmp    1210 <json_emit_quoted_str+0x110>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1230 <json_emit_quoted_str+0x130>
mov    $0x74,%r11b
jmp    1210 <json_emit_quoted_str+0x110>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1230 <json_emit_quoted_str+0x130>
mov    $0x6e,%r11b
jmp    1210 <json_emit_quoted_str+0x110>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1230 <json_emit_quoted_str+0x130>
mov    $0x66,%r11b
jmp    1210 <json_emit_quoted_str+0x110>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1230 <json_emit_quoted_str+0x130>
mov    $0x72,%r11b
jmp    1210 <json_emit_quoted_str+0x110>
lea    0x1(%rax),%r9d
movslq %eax,%rcx
movb   $0x5c,(%rdi,%rcx,1)
cmp    %esi,%r9d
jge    1230 <json_emit_quoted_str+0x130>
mov    $0x22,%r11b
nopw   0x0(%rax,%rax,1)
mov    $0x2,%r10d
add    %r10d,%eax
movslq %r9d,%rcx
mov    %r11b,(%rdi,%rcx,1)
jmp    1233 <json_emit_quoted_str+0x133>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r9d,%eax
movzbl (%rdx),%r11d
cmp    %esi,%eax
setl   %cl
test   %r11b,%r11b
je     124d <json_emit_quoted_str+0x14d>
add    $0x1,%rdx
cmp    %esi,%eax
jl     1140 <json_emit_quoted_str+0x40>
test   %cl,%cl
je     125b <json_emit_quoted_str+0x15b>
movslq %eax,%rcx
add    $0x1,%eax
movb   $0x22,(%rdi,%rcx,1)
cmp    %esi,%eax
jge    1269 <json_emit_quoted_str+0x169>
movslq %eax,%rcx
add    $0x1,%eax
movb   $0x0,(%rdi,%rcx,1)
xor    %ecx,%ecx
sub    $0x1,%eax
cmovb  %ecx,%eax
pop    %rbx
ret

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

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