#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 */
scalar_t__ calloc(int, int);
int strlen(char const *);
char *str_escape(const char *source) {
  const char *p = source;
  char *dest = (char *)calloc(4 * strlen(source) + 1, sizeof(char));
  char *q = dest;
  while (*p) {
    switch (*p) {
    case '\a':
      *q++ = '\\';
      *q++ = 'a';
    case '\b':
      *q++ = '\\';
      *q++ = 'b';
      break;
    case '\f':
      *q++ = '\\';
      *q++ = 'f';
      break;
    case '\n':
      *q++ = '\\';
      *q++ = 'n';
      break;
    case '\r':
      *q++ = '\\';
      *q++ = 'r';
      break;
    case '\t':
      *q++ = '\\';
      *q++ = 't';
      break;
    case '\v':
      *q++ = '\\';
      *q++ = 'v';
      break;
    case '\\':
    case '"':
    case '\'':
      *q++ = '\\';
      *q++ = *p;
      break;
    default:
      if ((*p <= ' ') || (*p >= 0177) || (*p == '=') || (*p == '#')) {
        *q++ = '\\';
        *q++ = '0' + (((*p) >> 6) & 07);
        *q++ = '0' + (((*p) >> 3) & 07);
        *q++ = '0' + ((*p) & 07);
      } else {
        *q++ = *p;
      }
      break;
    }
    p++;
  }
  *q = 0;
  return dest;
}


x86 assembly (clang, -O0):
<str_escape>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,%edi
shl    $0x2,%edi
add    $0x1,%edi
mov    $0x1,%esi
call   1040 <calloc@plt>
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     13c7 <str_escape+0x2a7>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
add    $0xfffffff9,%eax
mov    %eax,%ecx
mov    %rcx,-0x28(%rbp)
sub    $0x55,%eax
ja     12dd <str_escape+0x1bd>
mov    -0x28(%rbp),%rax
lea    0xe74(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x61,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x62,(%rax)
jmp    13b6 <str_escape+0x296>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x66,(%rax)
jmp    13b6 <str_escape+0x296>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x6e,(%rax)
jmp    13b6 <str_escape+0x296>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x72,(%rax)
jmp    13b6 <str_escape+0x296>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x74,(%rax)
jmp    13b6 <str_escape+0x296>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x76,(%rax)
jmp    13b6 <str_escape+0x296>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    13b6 <str_escape+0x296>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
jle    131d <str_escape+0x1fd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7f,%eax
jge    131d <str_escape+0x1fd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3d,%eax
je     131d <str_escape+0x1fd>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x23,%eax
jne    139a <str_escape+0x27a>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
movb   $0x5c,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sar    $0x6,%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
sar    $0x3,%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    13b1 <str_escape+0x291>
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x20(%rbp)
mov    %cl,(%rax)
jmp    13b6 <str_escape+0x296>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    115b <str_escape+0x3b>
mov    -0x20(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<str_escape>:
push   %rbx
mov    %rdi,%rbx
call   1030 <strlen@plt>
lea    0x1(,%rax,4),%edi
mov    $0x1,%esi
call   1040 <calloc@plt>
mov    (%rbx),%dl
test   %dl,%dl
je     120e <str_escape+0xee>
lea    0xeb5(%rip),%rsi
mov    %rax,%rcx
xchg   %ax,%ax
movsbl %dl,%edi
add    $0xfffffff9,%edi
cmp    $0x55,%edi
ja     1197 <str_escape+0x77>
movslq (%rsi,%rdi,4),%rdi
add    %rsi,%rdi
jmp    *%rdi
movb   $0x5c,(%rcx)
movzbl (%rbx),%edx
mov    %dl,0x1(%rcx)
jmp    11f0 <str_escape+0xd0>
movw   $0x615c,(%rcx)
add    $0x2,%rcx
movw   $0x625c,(%rcx)
jmp    11f0 <str_escape+0xd0>
movw   $0x745c,(%rcx)
jmp    11f0 <str_escape+0xd0>
movw   $0x665c,(%rcx)
jmp    11f0 <str_escape+0xd0>
movw   $0x725c,(%rcx)
jmp    11f0 <str_escape+0xd0>
cmp    $0x21,%dl
jl     11ab <str_escape+0x8b>
cmp    $0x23,%dl
je     11ab <str_escape+0x8b>
cmp    $0x7f,%dl
je     11ab <str_escape+0x8b>
cmp    $0x3d,%dl
jne    1206 <str_escape+0xe6>
movb   $0x5c,(%rcx)
movzbl (%rbx),%edx
sar    $0x6,%dl
and    $0x7,%dl
or     $0x30,%dl
mov    %dl,0x1(%rcx)
movzbl (%rbx),%edx
shr    $0x3,%dl
and    $0x7,%dl
or     $0x30,%dl
mov    %dl,0x2(%rcx)
movzbl (%rbx),%edx
and    $0x7,%dl
or     $0x30,%dl
mov    %dl,0x3(%rcx)
add    $0x4,%rcx
jmp    11f4 <str_escape+0xd4>
movw   $0x6e5c,(%rcx)
jmp    11f0 <str_escape+0xd0>
movw   $0x765c,(%rcx)
nopw   0x0(%rax,%rax,1)
add    $0x2,%rcx
movzbl 0x1(%rbx),%edx
add    $0x1,%rbx
test   %dl,%dl
jne    1150 <str_escape+0x30>
jmp    1211 <str_escape+0xf1>
mov    %dl,(%rcx)
add    $0x1,%rcx
jmp    11f4 <str_escape+0xd4>
mov    %rax,%rcx
movb   $0x0,(%rcx)
pop    %rbx
ret

LLVM IR (-O0):
define i8* @str_escape(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
store i8* %0, i8** %2
%6 = load i8*, i8** %2
store i8* %6, i8** %3
%7 = load i8*, i8** %2
%8 = call i32 @strlen(i8* %7)
%9 = mul nsw i32 4, %8
%10 = add nsw i32 %9, 1
%11 = call i64 @calloc(i32 %10, i32 1)
%12 = inttoptr i64 %11 to i8*
store i8* %12, i8** %4
%13 = load i8*, i8** %4
store i8* %13, i8** %5
br label %14
14: ; preds = %119, %1
%15 = load i8*, i8** %3
%16 = load i8, i8* %15
%17 = icmp ne i8 %16, 0
br i1 %17, label %18, label %122
18: ; preds = %14
%19 = load i8*, i8** %3
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
switch i32 %21, label %64 [
i32 7, label %22
i32 8, label %27
i32 12, label %32
i32 10, label %37
i32 13, label %42
i32 9, label %47
i32 11, label %52
i32 92, label %57
i32 34, label %57
i32 39, label %57
]
22: ; preds = %18
%23 = load i8*, i8** %5
%24 = getelementptr inbounds i8, i8* %23, i32 1
store i8* %24, i8** %5
store i8 92, i8* %23
%25 = load i8*, i8** %5
%26 = getelementptr inbounds i8, i8* %25, i32 1
store i8* %26, i8** %5
store i8 97, i8* %25
br label %27
27: ; preds = %18, %22
%28 = load i8*, i8** %5
%29 = getelementptr inbounds i8, i8* %28, i32 1
store i8* %29, i8** %5
store i8 92, i8* %28
%30 = load i8*, i8** %5
%31 = getelementptr inbounds i8, i8* %30, i32 1
store i8* %31, i8** %5
store i8 98, i8* %30
br label %119
32: ; preds = %18
%33 = load i8*, i8** %5
%34 = getelementptr inbounds i8, i8* %33, i32 1
store i8* %34, i8** %5
store i8 92, i8* %33
%35 = load i8*, i8** %5
%36 = getelementptr inbounds i8, i8* %35, i32 1
store i8* %36, i8** %5
store i8 102, i8* %35
br label %119
37: ; preds = %18
%38 = load i8*, i8** %5
%39 = getelementptr inbounds i8, i8* %38, i32 1
store i8* %39, i8** %5
store i8 92, i8* %38
%40 = load i8*, i8** %5
%41 = getelementptr inbounds i8, i8* %40, i32 1
store i8* %41, i8** %5
store i8 110, i8* %40
br label %119
42: ; preds = %18
%43 = load i8*, i8** %5
%44 = getelementptr inbounds i8, i8* %43, i32 1
store i8* %44, i8** %5
store i8 92, i8* %43
%45 = load i8*, i8** %5
%46 = getelementptr inbounds i8, i8* %45, i32 1
store i8* %46, i8** %5
store i8 114, i8* %45
br label %119
47: ; preds = %18
%48 = load i8*, i8** %5
%49 = getelementptr inbounds i8, i8* %48, i32 1
store i8* %49, i8** %5
store i8 92, i8* %48
%50 = load i8*, i8** %5
%51 = getelementptr inbounds i8, i8* %50, i32 1
store i8* %51, i8** %5
store i8 116, i8* %50
br label %119
52: ; preds = %18
%53 = load i8*, i8** %5
%54 = getelementptr inbounds i8, i8* %53, i32 1
store i8* %54, i8** %5
store i8 92, i8* %53
%55 = load i8*, i8** %5
%56 = getelementptr inbounds i8, i8* %55, i32 1
store i8* %56, i8** %5
store i8 118, i8* %55
br label %119
57: ; preds = %18, %18, %18
%58 = load i8*, i8** %5
%59 = getelementptr inbounds i8, i8* %58, i32 1
store i8* %59, i8** %5
store i8 92, i8* %58
%60 = load i8*, i8** %3
%61 = load i8, i8* %60
%62 = load i8*, i8** %5
%63 = getelementptr inbounds i8, i8* %62, i32 1
store i8* %63, i8** %5
store i8 %61, i8* %62
br label %119
64: ; preds = %18
%65 = load i8*, i8** %3
%66 = load i8, i8* %65
%67 = sext i8 %66 to i32
%68 = icmp sle i32 %67, 32
br i1 %68, label %84, label %69
69: ; preds = %64
%70 = load i8*, i8** %3
%71 = load i8, i8* %70
%72 = sext i8 %71 to i32
%73 = icmp sge i32 %72, 127
br i1 %73, label %84, label %74
74: ; preds = %69
%75 = load i8*, i8** %3
%76 = load i8, i8* %75
%77 = sext i8 %76 to i32
%78 = icmp eq i32 %77, 61
br i1 %78, label %84, label %79
79: ; preds = %74
%80 = load i8*, i8** %3
%81 = load i8, i8* %80
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %82, 35
br i1 %83, label %84, label %113
84: ; preds = %79, %74, %69, %64
%85 = load i8*, i8** %5
%86 = getelementptr inbounds i8, i8* %85, i32 1
store i8* %86, i8** %5
store i8 92, i8* %85
%87 = load i8*, i8** %3
%88 = load i8, i8* %87
%89 = sext i8 %88 to i32
%90 = ashr i32 %89, 6
%91 = and i32 %90, 7
%92 = add nsw i32 48, %91
%93 = trunc i32 %92 to i8
%94 = load i8*, i8** %5
%95 = getelementptr inbounds i8, i8* %94, i32 1
store i8* %95, i8** %5
store i8 %93, i8* %94
%96 = load i8*, i8** %3
%97 = load i8, i8* %96
%98 = sext i8 %97 to i32
%99 = ashr i32 %98, 3
%100 = and i32 %99, 7
%101 = add nsw i32 48, %100
%102 = trunc i32 %101 to i8
%103 = load i8*, i8** %5
%104 = getelementptr inbounds i8, i8* %103, i32 1
store i8* %104, i8** %5
store i8 %102, i8* %103
%105 = load i8*, i8** %3
%106 = load i8, i8* %105
%107 = sext i8 %106 to i32
%108 = and i32 %107, 7
%109 = add nsw i32 48, %108
%110 = trunc i32 %109 to i8
%111 = load i8*, i8** %5
%112 = getelementptr inbounds i8, i8* %111, i32 1
store i8* %112, i8** %5
store i8 %110, i8* %111
br label %118
113: ; preds = %79
%114 = load i8*, i8** %3
%115 = load i8, i8* %114
%116 = load i8*, i8** %5
%117 = getelementptr inbounds i8, i8* %116, i32 1
store i8* %117, i8** %5
store i8 %115, i8* %116
br label %118
118: ; preds = %113, %84
br label %119
119: ; preds = %118, %57, %52, %47, %42, %37, %32, %27
%120 = load i8*, i8** %3
%121 = getelementptr inbounds i8, i8* %120, i32 1
store i8* %121, i8** %3
br label %14
122: ; preds = %14
%123 = load i8*, i8** %5
store i8 0, i8* %123
%124 = load i8*, i8** %4
ret i8* %124
}

LLVM IR (-O2):
define i8* @str_escape(i8* %0) {
%2 = tail call i32 @strlen(i8* %0)
%3 = shl nsw i32 %2, 2
%4 = or i32 %3, 1
%5 = tail call i64 @calloc(i32 %4, i32 1)
%6 = inttoptr i64 %5 to i8*
%7 = load i8, i8* %0
%8 = icmp eq i8 %7, 0
br i1 %8, label %67, label %9
9: ; preds = %1, %62
%10 = phi i8 [ %65, %62 ], [ %7, %1 ]
%11 = phi i8* [ %63, %62 ], [ %6, %1 ]
%12 = phi i8* [ %64, %62 ], [ %0, %1 ]
%13 = sext i8 %10 to i32
switch i32 %13, label %40 [
i32 7, label %14
i32 8, label %17
i32 12, label %21
i32 10, label %24
i32 13, label %27
i32 9, label %30
i32 11, label %33
i32 92, label %36
i32 34, label %36
i32 39, label %36
]
14: ; preds = %9
%15 = getelementptr inbounds i8, i8* %11, i64 1
store i8 92, i8* %11
%16 = getelementptr inbounds i8, i8* %11, i64 2
store i8 97, i8* %15
br label %17
17: ; preds = %9, %14
%18 = phi i8* [ %11, %9 ], [ %16, %14 ]
%19 = getelementptr inbounds i8, i8* %18, i64 1
store i8 92, i8* %18
%20 = getelementptr inbounds i8, i8* %18, i64 2
store i8 98, i8* %19
br label %62
21: ; preds = %9
%22 = getelementptr inbounds i8, i8* %11, i64 1
store i8 92, i8* %11
%23 = getelementptr inbounds i8, i8* %11, i64 2
store i8 102, i8* %22
br label %62
24: ; preds = %9
%25 = getelementptr inbounds i8, i8* %11, i64 1
store i8 92, i8* %11
%26 = getelementptr inbounds i8, i8* %11, i64 2
store i8 110, i8* %25
br label %62
27: ; preds = %9
%28 = getelementptr inbounds i8, i8* %11, i64 1
store i8 92, i8* %11
%29 = getelementptr inbounds i8, i8* %11, i64 2
store i8 114, i8* %28
br label %62
30: ; preds = %9
%31 = getelementptr inbounds i8, i8* %11, i64 1
store i8 92, i8* %11
%32 = getelementptr inbounds i8, i8* %11, i64 2
store i8 116, i8* %31
br label %62
33: ; preds = %9
%34 = getelementptr inbounds i8, i8* %11, i64 1
store i8 92, i8* %11
%35 = getelementptr inbounds i8, i8* %11, i64 2
store i8 118, i8* %34
br label %62
36: ; preds = %9, %9, %9
%37 = getelementptr inbounds i8, i8* %11, i64 1
store i8 92, i8* %11
%38 = load i8, i8* %12
%39 = getelementptr inbounds i8, i8* %11, i64 2
store i8 %38, i8* %37
br label %62
40: ; preds = %9
%41 = freeze i8 %10
%42 = icmp slt i8 %41, 33
br i1 %42, label %44, label %43
43: ; preds = %40
switch i8 %41, label %60 [
i8 127, label %44
i8 61, label %44
i8 35, label %44
]
44: ; preds = %43, %43, %43, %40
%45 = getelementptr inbounds i8, i8* %11, i64 1
store i8 92, i8* %11
%46 = load i8, i8* %12
%47 = ashr i8 %46, 6
%48 = and i8 %47, 7
%49 = or i8 %48, 48
%50 = getelementptr inbounds i8, i8* %11, i64 2
store i8 %49, i8* %45
%51 = load i8, i8* %12
%52 = lshr i8 %51, 3
%53 = and i8 %52, 7
%54 = or i8 %53, 48
%55 = getelementptr inbounds i8, i8* %11, i64 3
store i8 %54, i8* %50
%56 = load i8, i8* %12
%57 = and i8 %56, 7
%58 = or i8 %57, 48
%59 = getelementptr inbounds i8, i8* %11, i64 4
store i8 %58, i8* %55
br label %62
60: ; preds = %43
%61 = getelementptr inbounds i8, i8* %11, i64 1
store i8 %41, i8* %11
br label %62
62: ; preds = %44, %60, %36, %33, %30, %27, %24, %21, %17
%63 = phi i8* [ %59, %44 ], [ %61, %60 ], [ %39, %36 ], [ %35, %33 ], [ %32, %30 ], [ %29, %27 ], [ %26, %24 ], [ %23, %21 ], [ %20, %17 ]
%64 = getelementptr inbounds i8, i8* %12, i64 1
%65 = load i8, i8* %64
%66 = icmp eq i8 %65, 0
br i1 %66, label %67, label %9
67: ; preds = %62, %1
%68 = phi i8* [ %6, %1 ], [ %63, %62 ]
store i8 0, i8* %68
ret i8* %6
}