#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 */
typedef int /*<<< orphan*/ name;

/* Variables and functions */
int /*<<< orphan*/ free(char *);
int /*<<< orphan*/ is_name_char(char const);
int /*<<< orphan*/ memcpy(char *, char const *, size_t const);
char *skip_format(char const *);
char *string_append(char *, char const *, size_t const);
int strlen(char const *);
char *format_object2(const char *format, const char **last, const void *object,
                     const char *(*getter)(const void *object,
                                           const char *name)) {
  char *ret = NULL;
  const char *p;
  bool found = false;
  for (p = format; *p != '\0';) {
    switch (p[0]) {
    case '|':
      ++p;
      if (!found) {
        free(ret);
        ret = NULL;
      } else
        p = skip_format(p);
      break;
    case '&':
      ++p;
      if (!found)
        p = skip_format(p);
      else
        found = false;
      break;
    case '[': {
      char *t = format_object2(p + 1, &p, object, getter);
      if (t != NULL) {
        ret = string_append(ret, t, strlen(t));
        free(t);
        found = true;
      }
    } break;
    case ']':
      if (last != NULL)
        *last = p + 1;
      if (!found) {
        free(ret);
        ret = NULL;
      }
      return ret;
    case '\\': {
      char ltemp;
      switch (p[1]) {
      case 'a':
        ltemp = '\a';
        break;
      case 'b':
        ltemp = '\b';
        break;
      case 't':
        ltemp = '\t';
        break;
      case 'n':
        ltemp = '\n';
        break;
      case 'v':
        ltemp = '\v';
        break;
      case 'f':
        ltemp = '\f';
        break;
      case 'r':
        ltemp = '\r';
        break;
      case '[':
      case ']':
        ltemp = p[1];
        break;
      default:
        ltemp = p[0];
        --p;
        break;
      }
      ret = string_append(ret, &ltemp, 1);
      p += 2;
    } break;
    case '%': {
      const char *end = p + 1;
      while (is_name_char(*end))
        ++end;
      const size_t length = end - p + 1;
      if (*end != '%') {
        ret = string_append(ret, p, length - 1);
        p = end;
        continue;
      }
      char name[32];
      if (length > (int)sizeof(name)) {
        ret = string_append(ret, p, length);
        p = end + 1;
        continue;
      }
      memcpy(name, p + 1, length - 2);
      name[length - 2] = 0;
      const char *value = getter(object, name);
      size_t value_length;
      if (value != NULL) {
        if (*value != 0)
          found = true;
        value_length = strlen(value);
      } else {
        value = p;
        value_length = length;
      }
      ret = string_append(ret, value, value_length);
      p = end + 1;
    } break;
    case '#':
      if (p[1] != '\0') {
        ret = string_append(ret, p + 1, 1);
        p += 2;
        break;
      }
    default:
      ret = string_append(ret, p, 1);
      ++p;
    }
  }
  if (last != NULL)
    *last = p;
  return ret;
}


x86 assembly (clang, -O0):
<format_object2>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1600 <format_object2+0x490>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x94(%rbp)
sub    $0x23,%eax
je     1598 <format_object2+0x428>
jmp    11cd <format_object2+0x5d>
mov    -0x94(%rbp),%eax
sub    $0x25,%eax
je     142d <format_object2+0x2bd>
jmp    11e1 <format_object2+0x71>
mov    -0x94(%rbp),%eax
sub    $0x26,%eax
je     1283 <format_object2+0x113>
jmp    11f5 <format_object2+0x85>
mov    -0x94(%rbp),%eax
sub    $0x5b,%eax
je     12b7 <format_object2+0x147>
jmp    1209 <format_object2+0x99>
mov    -0x94(%rbp),%eax
sub    $0x5c,%eax
je     136f <format_object2+0x1ff>
jmp    121d <format_object2+0xad>
mov    -0x94(%rbp),%eax
sub    $0x5d,%eax
je     132d <format_object2+0x1bd>
jmp    1231 <format_object2+0xc1>
mov    -0x94(%rbp),%eax
sub    $0x7c,%eax
jne    15d9 <format_object2+0x469>
jmp    1245 <format_object2+0xd5>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jne    1271 <format_object2+0x101>
mov    -0x30(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x30(%rbp)
jmp    127e <format_object2+0x10e>
mov    -0x38(%rbp),%rdi
call   1060 <skip_format@plt>
mov    %rax,-0x38(%rbp)
jmp    15fb <format_object2+0x48b>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpl   $0x0,-0x3c(%rbp)
jne    12ab <format_object2+0x13b>
mov    -0x38(%rbp),%rdi
call   1060 <skip_format@plt>
mov    %rax,-0x38(%rbp)
jmp    12b2 <format_object2+0x142>
movl   $0x0,-0x3c(%rbp)
jmp    15fb <format_object2+0x48b>
mov    -0x38(%rbp),%rdi
add    $0x1,%rdi
mov    -0x20(%rbp),%rdx
mov    -0x28(%rbp),%rcx
lea    -0x38(%rbp),%rsi
call   1040 <format_object2@plt>
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x48(%rbp)
je     1328 <format_object2+0x1b8>
mov    -0x30(%rbp),%rax
mov    %rax,-0xa8(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x48(%rbp),%rdi
call   1050 <strlen@plt>
mov    -0xa8(%rbp),%rdi
mov    -0xa0(%rbp),%rsi
movslq %eax,%rdx
call   1070 <string_append@plt>
mov    %rax,-0x30(%rbp)
mov    -0x48(%rbp),%rdi
call   1030 <free@plt>
movl   $0x1,-0x3c(%rbp)
jmp    15fb <format_object2+0x48b>
cmpq   $0x0,-0x18(%rbp)
je     1347 <format_object2+0x1d7>
mov    -0x38(%rbp),%rcx
add    $0x1,%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
cmpl   $0x0,-0x3c(%rbp)
jne    1362 <format_object2+0x1f2>
mov    -0x30(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    161e <format_object2+0x4ae>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
add    $0xffffffa5,%eax
mov    %eax,%ecx
mov    %rcx,-0xb0(%rbp)
sub    $0x1b,%eax
ja     13f1 <format_object2+0x281>
mov    -0xb0(%rbp),%rax
lea    0xc66(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movb   $0x7,-0x49(%rbp)
jmp    1406 <format_object2+0x296>
movb   $0x8,-0x49(%rbp)
jmp    1406 <format_object2+0x296>
movb   $0x9,-0x49(%rbp)
jmp    1406 <format_object2+0x296>
movb   $0xa,-0x49(%rbp)
jmp    1406 <format_object2+0x296>
movb   $0xb,-0x49(%rbp)
jmp    1406 <format_object2+0x296>
movb   $0xc,-0x49(%rbp)
jmp    1406 <format_object2+0x296>
movb   $0xd,-0x49(%rbp)
jmp    1406 <format_object2+0x296>
mov    -0x38(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x49(%rbp)
jmp    1406 <format_object2+0x296>
mov    -0x38(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x49(%rbp)
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rdi
lea    -0x49(%rbp),%rsi
mov    $0x1,%edx
call   1070 <string_append@plt>
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
jmp    15fb <format_object2+0x48b>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
movsbl (%rax),%edi
call   1080 <is_name_char@plt>
cmp    $0x0,%eax
je     145f <format_object2+0x2ef>
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x58(%rbp)
jmp    1439 <format_object2+0x2c9>
mov    -0x58(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    %rcx,%rax
add    $0x1,%rax
mov    %rax,-0x60(%rbp)
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x25,%eax
je     14a8 <format_object2+0x338>
mov    -0x30(%rbp),%rdi
mov    -0x38(%rbp),%rsi
mov    -0x60(%rbp),%rdx
sub    $0x1,%rdx
call   1070 <string_append@plt>
mov    %rax,-0x30(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,-0x38(%rbp)
jmp    11a2 <format_object2+0x32>
cmpq   $0x20,-0x60(%rbp)
jbe    14d9 <format_object2+0x369>
mov    -0x30(%rbp),%rdi
mov    -0x38(%rbp),%rsi
mov    -0x60(%rbp),%rdx
call   1070 <string_append@plt>
mov    %rax,-0x30(%rbp)
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    11a2 <format_object2+0x32>
lea    -0x80(%rbp),%rdi
mov    -0x38(%rbp),%rsi
add    $0x1,%rsi
mov    -0x60(%rbp),%rdx
sub    $0x2,%rdx
call   1090 <memcpy@plt>
mov    -0x60(%rbp),%rax
sub    $0x2,%rax
movb   $0x0,-0x80(%rbp,%rax,1)
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rdi
lea    -0x80(%rbp),%rsi
call   *%rax
mov    %rax,-0x88(%rbp)
cmpq   $0x0,-0x88(%rbp)
je     1556 <format_object2+0x3e6>
mov    -0x88(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     153c <format_object2+0x3cc>
movl   $0x1,-0x3c(%rbp)
mov    -0x88(%rbp),%rdi
call   1050 <strlen@plt>
cltq
mov    %rax,-0x90(%rbp)
jmp    156c <format_object2+0x3fc>
mov    -0x38(%rbp),%rax
mov    %rax,-0x88(%rbp)
mov    -0x60(%rbp),%rax
mov    %rax,-0x90(%rbp)
mov    -0x30(%rbp),%rdi
mov    -0x88(%rbp),%rsi
mov    -0x90(%rbp),%rdx
call   1070 <string_append@plt>
mov    %rax,-0x30(%rbp)
mov    -0x58(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    15fb <format_object2+0x48b>
mov    -0x38(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
je     15d4 <format_object2+0x464>
mov    -0x30(%rbp),%rdi
mov    -0x38(%rbp),%rsi
add    $0x1,%rsi
mov    $0x1,%edx
call   1070 <string_append@plt>
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x38(%rbp)
jmp    15fb <format_object2+0x48b>
jmp    15d9 <format_object2+0x469>
mov    -0x30(%rbp),%rdi
mov    -0x38(%rbp),%rsi
mov    $0x1,%edx
call   1070 <string_append@plt>
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    11a2 <format_object2+0x32>
cmpq   $0x0,-0x18(%rbp)
je     1616 <format_object2+0x4a6>
mov    -0x38(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<format_object2>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %rdx,0x40(%rsp)
mov    %rsi,0x30(%rsp)
mov    %rdi,%r13
mov    %rdi,(%rsp)
mov    (%rdi),%al
xor    %r14d,%r14d
test   %al,%al
je     1445 <format_object2+0x2d5>
mov    %rcx,%r15
lea    0xe5a(%rip),%rbp
xor    %r12d,%r12d
mov    %rcx,0x38(%rsp)
jmp    11d8 <format_object2+0x68>
mov    $0x1,%edx
mov    %r12,%rdi
mov    %r13,%rsi
call   1070 <string_append@plt>
mov    %rax,%r12
addq   $0x1,(%rsp)
mov    (%rsp),%r13
mov    0x0(%r13),%al
test   %al,%al
je     1448 <format_object2+0x2d8>
movsbl %al,%ecx
lea    -0x23(%rcx),%edx
cmp    $0x3a,%edx
ja     1210 <format_object2+0xa0>
movslq 0x0(%rbp,%rdx,4),%rcx
add    %rbp,%rcx
jmp    *%rcx
cmpb   $0x0,0x1(%r13)
je     11b0 <format_object2+0x40>
add    $0x1,%r13
mov    $0x1,%edx
mov    %r12,%rdi
mov    %r13,%rsi
jmp    1403 <format_object2+0x293>
nopl   0x0(%rax,%rax,1)
cmp    $0x7c,%ecx
jne    11b0 <format_object2+0x40>
add    $0x1,%r13
mov    %r13,(%rsp)
test   %r14d,%r14d
je     13a6 <format_object2+0x236>
mov    %r13,%rdi
call   1060 <skip_format@plt>
mov    %rax,(%rsp)
jmp    11c8 <format_object2+0x58>
mov    %r15,%rbx
mov    %r14,0x8(%rsp)
xor    %r15d,%r15d
nop
movsbl 0x1(%r13,%r15,1),%edi
call   1080 <is_name_char@plt>
add    $0x1,%r15
test   %eax,%eax
jne    1240 <format_object2+0xd0>
mov    (%rsp),%r14
mov    %r13,%rdx
sub    %r14,%rdx
cmpb   $0x25,0x0(%r13,%r15,1)
jne    136d <format_object2+0x1fd>
lea    (%rdx,%r15,1),%rbx
add    $0x1,%rbx
cmp    $0x21,%rbx
jae    1419 <format_object2+0x2a9>
lea    0x1(%r14),%rsi
add    %r15,%rdx
add    $0xffffffffffffffff,%rdx
lea    0x10(%rsp),%rdi
call   1090 <memcpy@plt>
lea    0xf(%rsp),%rax
add    %r13,%rax
sub    %r14,%rax
movb   $0x0,(%rax,%r15,1)
mov    0x40(%rsp),%rdi
lea    0x10(%rsp),%rsi
call   *0x38(%rsp)
test   %rax,%rax
je     1415 <format_object2+0x2a5>
mov    %rax,%r14
cmpb   $0x0,(%rax)
mov    $0x1,%eax
mov    0x8(%rsp),%rcx
cmovne %eax,%ecx
mov    %rcx,0x8(%rsp)
mov    %r14,%rdi
call   1050 <strlen@plt>
movslq %eax,%rbx
jmp    1419 <format_object2+0x2a9>
add    $0x1,%r13
mov    %r13,(%rsp)
test   %r14d,%r14d
je     1392 <format_object2+0x222>
xor    %r14d,%r14d
jmp    11c8 <format_object2+0x58>
add    $0x1,%r13
mov    %r13,%rdi
mov    %rsp,%rsi
mov    0x40(%rsp),%rdx
mov    %r15,%rcx
call   1040 <format_object2@plt>
test   %rax,%rax
je     11c8 <format_object2+0x58>
mov    %rax,%rbx
mov    %rax,%rdi
call   1050 <strlen@plt>
movslq %eax,%rdx
mov    %r12,%rdi
mov    %rbx,%rsi
call   1070 <string_append@plt>
mov    %rax,%r12
mov    %rbx,%rdi
call   1030 <free@plt>
mov    $0x1,%r14d
jmp    11c8 <format_object2+0x58>
movsbl 0x1(%r13),%ecx
lea    -0x5b(%rcx),%edx
cmp    $0x1b,%edx
ja     13b9 <format_object2+0x249>
lea    0xd91(%rip),%rsi
movslq (%rsi,%rdx,4),%rdx
add    %rsi,%rdx
jmp    *%rdx
mov    %cl,0x10(%rsp)
jmp    13f6 <format_object2+0x286>
add    %r15,%rdx
add    %r15,%r13
mov    %r12,%rdi
mov    %r14,%rsi
call   1070 <string_append@plt>
mov    %rax,%r12
mov    %r13,(%rsp)
mov    0x8(%rsp),%r14
mov    %rbx,%r15
jmp    11c8 <format_object2+0x58>
mov    %r13,%rdi
call   1060 <skip_format@plt>
mov    %rax,(%rsp)
xor    %r14d,%r14d
jmp    11c8 <format_object2+0x58>
mov    %r12,%rdi
call   1030 <free@plt>
xor    %r14d,%r14d
xor    %r12d,%r12d
jmp    11c8 <format_object2+0x58>
mov    %al,0x10(%rsp)
add    $0xffffffffffffffff,%r13
mov    %r13,(%rsp)
jmp    13f6 <format_object2+0x286>
movb   $0x7,0x10(%rsp)
jmp    13f6 <format_object2+0x286>
movb   $0x8,0x10(%rsp)
jmp    13f6 <format_object2+0x286>
movb   $0xc,0x10(%rsp)
jmp    13f6 <format_object2+0x286>
movb   $0xa,0x10(%rsp)
jmp    13f6 <format_object2+0x286>
movb   $0xd,0x10(%rsp)
jmp    13f6 <format_object2+0x286>
movb   $0x9,0x10(%rsp)
jmp    13f6 <format_object2+0x286>
movb   $0xb,0x10(%rsp)
mov    $0x1,%edx
mov    %r12,%rdi
lea    0x10(%rsp),%rsi
call   1070 <string_append@plt>
mov    %rax,%r12
addq   $0x2,(%rsp)
jmp    11c8 <format_object2+0x58>
mov    (%rsp),%r14
mov    %r12,%rdi
mov    %r14,%rsi
mov    %rbx,%rdx
call   1070 <string_append@plt>
mov    %rax,%r12
lea    (%r15,%r13,1),%rax
add    $0x1,%rax
mov    %rax,(%rsp)
mov    0x38(%rsp),%r15
mov    0x8(%rsp),%r14
jmp    11c8 <format_object2+0x58>
xor    %r12d,%r12d
mov    0x30(%rsp),%rax
test   %rax,%rax
je     1455 <format_object2+0x2e5>
mov    %r13,(%rax)
mov    %r12,%rax
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    0x30(%rsp),%rax
test   %rax,%rax
je     1478 <format_object2+0x308>
add    $0x1,%r13
mov    %r13,(%rax)
test   %r14d,%r14d
jne    1455 <format_object2+0x2e5>
mov    %r12,%rdi
call   1030 <free@plt>
xor    %r12d,%r12d
jmp    1455 <format_object2+0x2e5>

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

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