#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ bcopy(char *, char *, int);
char *ck_malloc(int);
char *ck_realloc(char *, int);
scalar_t__ isprint(unsigned char);
int strlen(char *);
char *backslash_a_string(char *string, int add_quote) {
  char *pf, *pt;
  unsigned char ch;
  int size, len;
  static char *cbuf;
  static int s_cbuf;
  pt = 0;
  pf = string;
  if (add_quote) {
    len = strlen(pf);
    size = pf - string;
    if (s_cbuf < 3 + size + 4 * len) {
      s_cbuf = 3 + size + 4 * len;
      cbuf = (cbuf) ? ck_realloc(cbuf, s_cbuf) : ck_malloc(s_cbuf);
    }
    if (size)
      bcopy(string, cbuf, size);
    pt = cbuf + size;
    *pt++ = '"';
  }
  for (; *pf; pf++) {
    ch = *pf;
    if (isprint(ch) && ch != '\\' && (ch != '%' || !(add_quote == 2)) &&
        (ch != '"' || !add_quote)) {
      if (pt)
        *pt++ = ch;
      continue;
    }
    if (!pt) {
      len = strlen(pf);
      size = pf - string;
      if (s_cbuf < 3 + size + 4 * len) {
        s_cbuf = 3 + size + 4 * len;
        cbuf = (cbuf) ? ck_realloc(cbuf, s_cbuf) : ck_malloc(s_cbuf);
      }
      if (size)
        bcopy(string, cbuf, size);
      pt = cbuf + size;
    }
    if (ch == '\\') {
      *pt++ = '\\';
      *pt++ = '\\';
    } else if (ch == '"') {
      *pt++ = '\\';
      *pt++ = ch;
    } else if (ch == '%') {
      *pt++ = '%';
      *pt++ = '%';
    } else {
      *pt++ = '\\';
      *pt++ = ((ch >> 6) & 0x3) + '0';
      *pt++ = ((ch >> 3) & 0x7) + '0';
      *pt++ = (ch & 0x7) + '0';
    }
  }
  if (add_quote)
    *pt++ = '"';
  if (pt) {
    *pt++ = '\0';
    return cbuf;
  }
  return string;
}


x86 assembly (clang, -O0):
<backslash_a_string>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     1247 <backslash_a_string+0xf7>
mov    -0x20(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x34(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x30(%rbp)
mov    0x2ebf(%rip),%eax
mov    -0x30(%rbp),%ecx
add    $0x3,%ecx
mov    -0x34(%rbp),%edx
shl    $0x2,%edx
add    %edx,%ecx
cmp    %ecx,%eax
jge    1206 <backslash_a_string+0xb6>
mov    -0x30(%rbp),%eax
add    $0x3,%eax
mov    -0x34(%rbp),%ecx
shl    $0x2,%ecx
add    %ecx,%eax
mov    %eax,0x2e95(%rip)
cmpq   $0x0,0x2e85(%rip)
je     11ec <backslash_a_string+0x9c>
mov    0x2e78(%rip),%rdi
mov    0x2e7a(%rip),%esi
call   1050 <ck_realloc@plt>
mov    %rax,-0x40(%rbp)
jmp    11fb <backslash_a_string+0xab>
mov    0x2e66(%rip),%edi
call   1040 <ck_malloc@plt>
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,0x2e4a(%rip)
cmpl   $0x0,-0x30(%rbp)
je     1223 <backslash_a_string+0xd3>
mov    -0x10(%rbp),%rdi
mov    0x2e35(%rip),%rsi
mov    -0x30(%rbp),%edx
call   1060 <bcopy@plt>
mov    0x2e26(%rip),%rax
movslq -0x30(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x22,(%rax)
jmp    124c <backslash_a_string+0xfc>
mov    -0x20(%rbp),%rax
cmpb   $0x0,(%rax)
je     14ce <backslash_a_string+0x37e>
mov    -0x20(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movzbl -0x29(%rbp),%edi
call   1070 <isprint@plt>
cmp    $0x0,%rax
je     12d4 <backslash_a_string+0x184>
movzbl -0x29(%rbp),%eax
cmp    $0x5c,%eax
je     12d4 <backslash_a_string+0x184>
movzbl -0x29(%rbp),%eax
cmp    $0x25,%eax
jne    1299 <backslash_a_string+0x149>
cmpl   $0x2,-0x14(%rbp)
je     12d4 <backslash_a_string+0x184>
movzbl -0x29(%rbp),%eax
cmp    $0x22,%eax
jne    12b0 <backslash_a_string+0x160>
cmpl   $0x0,-0x14(%rbp)
jne    12d4 <backslash_a_string+0x184>
cmpq   $0x0,-0x28(%rbp)
je     12cf <backslash_a_string+0x17f>
mov    -0x29(%rbp),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    14bd <backslash_a_string+0x36d>
cmpq   $0x0,-0x28(%rbp)
jne    139b <backslash_a_string+0x24b>
mov    -0x20(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x34(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x30(%rbp)
mov    0x2d59(%rip),%eax
mov    -0x30(%rbp),%ecx
add    $0x3,%ecx
mov    -0x34(%rbp),%edx
shl    $0x2,%edx
add    %edx,%ecx
cmp    %ecx,%eax
jge    136c <backslash_a_string+0x21c>
mov    -0x30(%rbp),%eax
add    $0x3,%eax
mov    -0x34(%rbp),%ecx
shl    $0x2,%ecx
add    %ecx,%eax
mov    %eax,0x2d2f(%rip)
cmpq   $0x0,0x2d1f(%rip)
je     1352 <backslash_a_string+0x202>
mov    0x2d12(%rip),%rdi
mov    0x2d14(%rip),%esi
call   1050 <ck_realloc@plt>
mov    %rax,-0x48(%rbp)
jmp    1361 <backslash_a_string+0x211>
mov    0x2d00(%rip),%edi
call   1040 <ck_malloc@plt>
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,0x2ce4(%rip)
cmpl   $0x0,-0x30(%rbp)
je     1389 <backslash_a_string+0x239>
mov    -0x10(%rbp),%rdi
mov    0x2ccf(%rip),%rsi
mov    -0x30(%rbp),%edx
call   1060 <bcopy@plt>
mov    0x2cc0(%rip),%rax
movslq -0x30(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
movzbl -0x29(%rbp),%eax
cmp    $0x5c,%eax
jne    13d1 <backslash_a_string+0x281>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x5c,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x5c,(%rax)
jmp    14b8 <backslash_a_string+0x368>
movzbl -0x29(%rbp),%eax
cmp    $0x22,%eax
jne    1409 <backslash_a_string+0x2b9>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x5c,(%rax)
mov    -0x29(%rbp),%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    14b3 <backslash_a_string+0x363>
movzbl -0x29(%rbp),%eax
cmp    $0x25,%eax
jne    143f <backslash_a_string+0x2ef>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x25,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x25,(%rax)
jmp    14ae <backslash_a_string+0x35e>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x5c,(%rax)
movzbl -0x29(%rbp),%eax
sar    $0x6,%eax
and    $0x3,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
movzbl -0x29(%rbp),%eax
sar    $0x3,%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
movzbl -0x29(%rbp),%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x28(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
mov    %cl,(%rax)
jmp    14b3 <backslash_a_string+0x363>
jmp    14b8 <backslash_a_string+0x368>
jmp    14bd <backslash_a_string+0x36d>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    124c <backslash_a_string+0xfc>
cmpl   $0x0,-0x14(%rbp)
je     14ea <backslash_a_string+0x39a>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x22,(%rax)
cmpq   $0x0,-0x28(%rbp)
je     1517 <backslash_a_string+0x3c7>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x0,(%rax)
mov    0x2b42(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    151f <backslash_a_string+0x3cf>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<backslash_a_string>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %esi,%r14d
mov    %rdi,%r15
test   %esi,%esi
je     1195 <backslash_a_string+0x45>
mov    %r15,%rdi
call   1030 <strlen@plt>
lea    0x3(,%rax,4),%esi
cmp    %esi,0x2ede(%rip)
jge    119a <backslash_a_string+0x4a>
mov    %esi,0x2ed6(%rip)
mov    0x2ec7(%rip),%rdi
test   %rdi,%rdi
je     11a3 <backslash_a_string+0x53>
call   1050 <ck_realloc@plt>
jmp    11aa <backslash_a_string+0x5a>
xor    %r12d,%r12d
jmp    11bd <backslash_a_string+0x6d>
mov    0x2eaf(%rip),%r12
jmp    11b4 <backslash_a_string+0x64>
mov    %esi,%edi
call   1040 <ck_malloc@plt>
mov    %rax,%r12
mov    %rax,0x2e9c(%rip)
movb   $0x22,(%r12)
add    $0x1,%r12
mov    (%r15),%r13b
test   %r13b,%r13b
je     133b <backslash_a_string+0x1eb>
xor    %ebp,%ebp
xor    %ebx,%ebx
jmp    11fa <backslash_a_string+0xaa>
movw   $0x2525,(%r12)
add    $0x2,%r12
movzbl 0x1(%r15,%rbx,1),%r13d
add    $0x1,%rbx
movabs $0x100000000,%rax
add    %rax,%rbp
test   %r13b,%r13b
je     133b <backslash_a_string+0x1eb>
movzbl %r13b,%edi
call   1060 <isprint@plt>
test   %rax,%rax
je     1250 <backslash_a_string+0x100>
cmp    $0x5c,%r13b
je     1250 <backslash_a_string+0x100>
cmp    $0x2,%r14d
sete   %dl
test   %r14d,%r14d
setne  %al
cmp    $0x25,%r13b
sete   %cl
cmp    $0x22,%r13b
sete   %sil
test   %cl,%dl
jne    1250 <backslash_a_string+0x100>
and    %sil,%al
jne    1250 <backslash_a_string+0x100>
test   %r12,%r12
je     12ec <backslash_a_string+0x19c>
mov    %r13b,(%r12)
add    $0x1,%r12
jmp    11da <backslash_a_string+0x8a>
cs nopw 0x0(%rax,%rax,1)
test   %r12,%r12
je     1280 <backslash_a_string+0x130>
cmp    $0x22,%r13b
je     132f <backslash_a_string+0x1df>
cmp    $0x25,%r13b
je     11cf <backslash_a_string+0x7f>
cmp    $0x5c,%r13b
jne    12b5 <backslash_a_string+0x165>
movw   $0x5c5c,(%r12)
jmp    11d6 <backslash_a_string+0x86>
nopl   0x0(%rax,%rax,1)
lea    (%r15,%rbx,1),%rdi
call   1030 <strlen@plt>
shl    $0x2,%eax
lea    (%rbx,%rax,1),%rsi
add    $0x3,%rsi
cmp    %esi,0x2dbe(%rip)
jge    1302 <backslash_a_string+0x1b2>
mov    %esi,0x2db6(%rip)
mov    0x2da7(%rip),%rdi
test   %rdi,%rdi
je     12f4 <backslash_a_string+0x1a4>
call   1050 <ck_realloc@plt>
jmp    12fb <backslash_a_string+0x1ab>
movb   $0x5c,(%r12)
mov    %r13d,%eax
shr    $0x6,%al
or     $0x30,%al
mov    %al,0x1(%r12)
mov    %r13d,%eax
shr    $0x3,%al
and    $0x7,%al
or     $0x30,%al
mov    %al,0x2(%r12)
and    $0x7,%r13b
or     $0x30,%r13b
mov    %r13b,0x3(%r12)
add    $0x4,%r12
jmp    11da <backslash_a_string+0x8a>
xor    %r12d,%r12d
jmp    11da <backslash_a_string+0x8a>
mov    %esi,%edi
call   1040 <ck_malloc@plt>
mov    %rax,0x2d4e(%rip)
mov    0x2d47(%rip),%r12
test   %ebx,%ebx
je     131b <backslash_a_string+0x1cb>
mov    %r12,%rdi
mov    %r15,%rsi
mov    %rbx,%rdx
call   1070 <memmove@plt>
mov    %rbp,%rax
sar    $0x20,%rax
add    %rax,%r12
cmp    $0x22,%r13b
jne    125f <backslash_a_string+0x10f>
movw   $0x225c,(%r12)
jmp    11d6 <backslash_a_string+0x86>
test   %r14d,%r14d
je     134b <backslash_a_string+0x1fb>
movb   $0x22,(%r12)
add    $0x1,%r12
jmp    1350 <backslash_a_string+0x200>
test   %r12,%r12
je     135c <backslash_a_string+0x20c>
movb   $0x0,(%r12)
mov    0x2cf4(%rip),%r15
mov    %r15,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@backslash_a_string.cbuf = internal unnamed_addr global i8* null
@backslash_a_string.s_cbuf = internal unnamed_addr global i32 0
define i8* @backslash_a_string(i8* %0, i32 %1) {
%3 = icmp ne i32 %1, 0
br i1 %3, label %4, label %24
4: ; preds = %2
%5 = tail call i32 @strlen(i8* %0)
%6 = load i32, i32* @backslash_a_string.s_cbuf
%7 = shl nsw i32 %5, 2
%8 = or i32 %7, 3
%9 = icmp slt i32 %6, %8
br i1 %9, label %12, label %10
10: ; preds = %4
%11 = load i8*, i8** @backslash_a_string.cbuf
br label %21
12: ; preds = %4
store i32 %8, i32* @backslash_a_string.s_cbuf
%13 = load i8*, i8** @backslash_a_string.cbuf
%14 = icmp eq i8* %13, null
br i1 %14, label %17, label %15
15: ; preds = %12
%16 = tail call i8* @ck_realloc(i8* %13, i32 %8)
br label %19
17: ; preds = %12
%18 = tail call i8* @ck_malloc(i32 %8)
br label %19
19: ; preds = %17, %15
%20 = phi i8* [ %16, %15 ], [ %18, %17 ]
store i8* %20, i8** @backslash_a_string.cbuf
br label %21
21: ; preds = %10, %19
%22 = phi i8* [ %11, %10 ], [ %20, %19 ]
%23 = getelementptr inbounds i8, i8* %22, i64 1
store i8 34, i8* %22
br label %24
24: ; preds = %21, %2
%25 = phi i8* [ %23, %21 ], [ null, %2 ]
%26 = load i8, i8* %0
%27 = icmp eq i8 %26, 0
br i1 %27, label %106, label %28
28: ; preds = %24
%29 = icmp eq i32 %1, 2
%30 = ptrtoint i8* %0 to i64
br label %31
31: ; preds = %28, %101
%32 = phi i8 [ %26, %28 ], [ %104, %101 ]
%33 = phi i8* [ %25, %28 ], [ %102, %101 ]
%34 = phi i8* [ %0, %28 ], [ %103, %101 ]
%35 = tail call i64 @isprint(i8 zeroext %32)
%36 = icmp ne i64 %35, 0
%37 = icmp ne i8 %32, 92
%38 = and i1 %36, %37
br i1 %38, label %39, label %49
39: ; preds = %31
%40 = icmp eq i8 %32, 37
%41 = and i1 %29, %40
%42 = icmp eq i8 %32, 34
%43 = and i1 %3, %42
%44 = or i1 %41, %43
br i1 %44, label %49, label %45
45: ; preds = %39
%46 = icmp eq i8* %33, null
br i1 %46, label %101, label %47
47: ; preds = %45
%48 = getelementptr inbounds i8, i8* %33, i64 1
store i8 %32, i8* %33
br label %101
49: ; preds = %39, %31
%50 = icmp eq i8* %33, null
br i1 %50, label %51, label %78
51: ; preds = %49
%52 = tail call i32 @strlen(i8* %34)
%53 = ptrtoint i8* %34 to i64
%54 = sub i64 %53, %30
%55 = trunc i64 %54 to i32
%56 = load i32, i32* @backslash_a_string.s_cbuf
%57 = add nsw i32 %55, 3
%58 = shl nsw i32 %52, 2
%59 = add nsw i32 %57, %58
%60 = icmp slt i32 %56, %59
br i1 %60, label %61, label %70
61: ; preds = %51
store i32 %59, i32* @backslash_a_string.s_cbuf
%62 = load i8*, i8** @backslash_a_string.cbuf
%63 = icmp eq i8* %62, null
br i1 %63, label %66, label %64
64: ; preds = %61
%65 = tail call i8* @ck_realloc(i8* %62, i32 %59)
br label %68
66: ; preds = %61
%67 = tail call i8* @ck_malloc(i32 %59)
br label %68
68: ; preds = %66, %64
%69 = phi i8* [ %65, %64 ], [ %67, %66 ]
store i8* %69, i8** @backslash_a_string.cbuf
br label %70
70: ; preds = %68, %51
%71 = icmp eq i32 %55, 0
%72 = load i8*, i8** @backslash_a_string.cbuf
br i1 %71, label %74, label %73
73: ; preds = %70
tail call void @llvm.memmove.p0i8.p0i8.i32(i8* align 1 %72, i8* align 1 %0, i32 %55, i1 false)
br label %74
74: ; preds = %70, %73
%75 = shl i64 %54, 32
%76 = ashr exact i64 %75, 32
%77 = getelementptr inbounds i8, i8* %72, i64 %76
br label %78
78: ; preds = %74, %49
%79 = phi i8* [ %33, %49 ], [ %77, %74 ]
switch i8 %32, label %89 [
i8 92, label %80
i8 34, label %83
i8 37, label %86
]
80: ; preds = %78
%81 = getelementptr inbounds i8, i8* %79, i64 1
store i8 92, i8* %79
%82 = getelementptr inbounds i8, i8* %79, i64 2
store i8 92, i8* %81
br label %101
83: ; preds = %78
%84 = getelementptr inbounds i8, i8* %79, i64 1
store i8 92, i8* %79
%85 = getelementptr inbounds i8, i8* %79, i64 2
store i8 34, i8* %84
br label %101
86: ; preds = %78
%87 = getelementptr inbounds i8, i8* %79, i64 1
store i8 37, i8* %79
%88 = getelementptr inbounds i8, i8* %79, i64 2
store i8 37, i8* %87
br label %101
89: ; preds = %78
%90 = getelementptr inbounds i8, i8* %79, i64 1
store i8 92, i8* %79
%91 = lshr i8 %32, 6
%92 = or i8 %91, 48
%93 = getelementptr inbounds i8, i8* %79, i64 2
store i8 %92, i8* %90
%94 = lshr i8 %32, 3
%95 = and i8 %94, 7
%96 = or i8 %95, 48
%97 = getelementptr inbounds i8, i8* %79, i64 3
store i8 %96, i8* %93
%98 = and i8 %32, 7
%99 = or i8 %98, 48
%100 = getelementptr inbounds i8, i8* %79, i64 4
store i8 %99, i8* %97
br label %101
101: ; preds = %80, %86, %89, %83, %45, %47
%102 = phi i8* [ %82, %80 ], [ %85, %83 ], [ %88, %86 ], [ %100, %89 ], [ %48, %47 ], [ null, %45 ]
%103 = getelementptr inbounds i8, i8* %34, i64 1
%104 = load i8, i8* %103
%105 = icmp eq i8 %104, 0
br i1 %105, label %106, label %31
106: ; preds = %101, %24
%107 = phi i8* [ %25, %24 ], [ %102, %101 ]
br i1 %3, label %108, label %110
108: ; preds = %106
%109 = getelementptr inbounds i8, i8* %107, i64 1
store i8 34, i8* %107
br label %112
110: ; preds = %106
%111 = icmp eq i8* %107, null
br i1 %111, label %115, label %112
112: ; preds = %108, %110
%113 = phi i8* [ %109, %108 ], [ %107, %110 ]
store i8 0, i8* %113
%114 = load i8*, i8** @backslash_a_string.cbuf
br label %115
115: ; preds = %110, %112
%116 = phi i8* [ %114, %112 ], [ %0, %110 ]
ret i8* %116
}