format(putsub, fmt, argp) register int (*putsub)();
register char *fmt;
char *argp;
{
  register int c;
  union {
    int *ip;
    char *cp;
    char **cpp;
  } args;
  int charcount;
  int rj, fillc;
  int maxwidth, width;
  int i, k;
  char *cp;
  auto char s[200];
  charcount = 0;
  args.cp = argp;
  while (c = *fmt++) {
    if (c == '%') {
      s[14] = 0;
      rj = 1;
      fillc = ' ';
      maxwidth = 10000;
      if ((c = *fmt++) == '-') {
        rj = 0;
        c = *fmt++;
      }
      if (c == '0') {
        fillc = '0';
        c = *fmt++;
      }
      if (c == '*') {
        width = *args.ip++;
        c = *fmt++;
      } else {
        for (width = 0; isdigit(c); c = *fmt++)
          width = width * 10 + c - '0';
      }
      if (c == '.') {
        if ((c = *fmt++) == '*') {
          maxwidth = *args.ip++;
          c = *fmt++;
        } else {
          for (maxwidth = 0; isdigit(c); c = *fmt++)
            maxwidth = maxwidth * 10 + c - '0';
        }
      }
      i = sizeof(int);
      if (c == 'l') {
        c = *fmt++;
        i = sizeof(long);
      } else if (c == 'h')
        c = *fmt++;
      switch (c) {
      case 'o':
        k = 8;
        goto do_conversion;
      case 'u':
        k = 10;
        goto do_conversion;
      case 'x':
        k = 16;
        goto do_conversion;
      case 'd':
        k = -10;
      do_conversion:
        cp = fmtcvt(args.cp, k, s + 14, i);
        args.cp += i;
        break;
      case 's':
        i = strlen(cp = *args.cpp++);
        goto havelen;
      case 'c':
        c = *args.ip++;
      default:
        *(cp = s + 13) = c;
        break;
      }
      i = (s + 14) - cp;
    havelen:
      if (i > maxwidth)
        i = maxwidth;
      if (rj) {
        for (; width-- > i; ++charcount)
          if ((*putsub)(fillc) == -1)
            return -1;
      }
      for (k = 0; *cp && k < maxwidth; ++k)
        if ((*putsub)(*cp++) == -1)
          return -1;
      charcount += k;
      if (!rj) {
        for (; width-- > i; ++charcount)
          if ((*putsub)(' ') == -1)
            return -1;
      }
    } else {
      if ((*putsub)(c) == -1)
        return -1;
      ++charcount;
    }
  }
  return charcount;
}


x86 assembly (clang, -O0):
<format>:
push   %rbp
mov    %rsp,%rbp
sub    $0x130,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
cmp    $0x0,%eax
je     15e7 <format+0x4b7>
cmpl   $0x25,-0x24(%rbp)
jne    15b9 <format+0x489>
movb   $0x0,-0x112(%rbp)
movl   $0x1,-0x38(%rbp)
movl   $0x20,-0x3c(%rbp)
movl   $0x2710,-0x40(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
cmp    $0x2d,%eax
jne    11d4 <format+0xa4>
movl   $0x0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x30,-0x24(%rbp)
jne    11fa <format+0xca>
movl   $0x30,-0x3c(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x2a,-0x24(%rbp)
jne    1232 <format+0x102>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
jmp    1276 <format+0x146>
movl   $0x0,-0x44(%rbp)
mov    -0x24(%rbp),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     1271 <format+0x141>
imul   $0xa,-0x44(%rbp),%eax
add    -0x24(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
jmp    1239 <format+0x109>
jmp    1276 <format+0x146>
cmpl   $0x2e,-0x24(%rbp)
jne    1315 <format+0x1e5>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
cmp    $0x2a,%eax
jne    12cc <format+0x19c>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
jmp    1310 <format+0x1e0>
movl   $0x0,-0x40(%rbp)
mov    -0x24(%rbp),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     130b <format+0x1db>
imul   $0xa,-0x40(%rbp),%eax
add    -0x24(%rbp),%eax
sub    $0x30,%eax
mov    %eax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
jmp    12d3 <format+0x1a3>
jmp    1310 <format+0x1e0>
jmp    1315 <format+0x1e5>
movl   $0x4,-0x48(%rbp)
cmpl   $0x6c,-0x24(%rbp)
jne    1347 <format+0x217>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
movl   $0x8,-0x48(%rbp)
jmp    136b <format+0x23b>
cmpl   $0x68,-0x24(%rbp)
jne    1366 <format+0x236>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
jmp    136b <format+0x23b>
mov    -0x24(%rbp),%eax
add    $0xffffff9d,%eax
mov    %eax,%ecx
mov    %rcx,-0x128(%rbp)
sub    $0x15,%eax
ja     1434 <format+0x304>
mov    -0x128(%rbp),%rax
lea    0xc6f(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
movl   $0x8,-0x4c(%rbp)
jmp    13c5 <format+0x295>
movl   $0xa,-0x4c(%rbp)
jmp    13c5 <format+0x295>
movl   $0x10,-0x4c(%rbp)
jmp    13c5 <format+0x295>
movl   $0xfffffff6,-0x4c(%rbp)
mov    -0x30(%rbp),%rdi
mov    -0x4c(%rbp),%esi
lea    -0x120(%rbp),%rdx
add    $0xe,%rdx
mov    -0x48(%rbp),%ecx
mov    $0x0,%al
call   1050 <fmtcvt@plt>
cltq
mov    %rax,-0x58(%rbp)
mov    -0x48(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    144c <format+0x31c>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%rdi
mov    %rdi,-0x58(%rbp)
call   1040 <strlen@plt>
mov    %eax,-0x48(%rbp)
jmp    1461 <format+0x331>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
lea    -0x120(%rbp),%rcx
add    $0xd,%rcx
mov    %rcx,-0x58(%rbp)
mov    %al,-0x113(%rbp)
lea    -0x120(%rbp),%rax
add    $0xe,%rax
mov    -0x58(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x40(%rbp),%eax
jle    1473 <format+0x343>
mov    -0x40(%rbp),%eax
mov    %eax,-0x48(%rbp)
cmpl   $0x0,-0x38(%rbp)
je     14ce <format+0x39e>
jmp    1482 <format+0x352>
mov    -0x44(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x44(%rbp)
cmp    -0x48(%rbp),%eax
jle    14c9 <format+0x399>
mov    -0x10(%rbp),%rcx
mov    -0x3c(%rbp),%edi
mov    $0x0,%al
call   *%rcx
cmp    $0xffffffff,%eax
jne    14b6 <format+0x386>
movl   $0xffffffff,-0x4(%rbp)
jmp    15ed <format+0x4bd>
jmp    14bb <format+0x38b>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1482 <format+0x352>
jmp    14ce <format+0x39e>
movl   $0x0,-0x4c(%rbp)
mov    -0x58(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x129(%rbp)
je     14fc <format+0x3cc>
mov    -0x4c(%rbp),%eax
cmp    -0x40(%rbp),%eax
setl   %al
mov    %al,-0x129(%rbp)
mov    -0x129(%rbp),%al
test   $0x1,%al
jne    150f <format+0x3df>
jmp    1551 <format+0x421>
mov    -0x10(%rbp),%rcx
mov    -0x58(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x58(%rbp)
movsbl (%rax),%edi
mov    $0x0,%al
call   *%rcx
cmp    $0xffffffff,%eax
jne    153e <format+0x40e>
movl   $0xffffffff,-0x4(%rbp)
jmp    15ed <format+0x4bd>
jmp    1543 <format+0x413>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    14d5 <format+0x3a5>
mov    -0x4c(%rbp),%eax
add    -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x38(%rbp)
jne    15b4 <format+0x484>
jmp    1569 <format+0x439>
mov    -0x44(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x44(%rbp)
cmp    -0x48(%rbp),%eax
jle    15af <format+0x47f>
mov    $0x20,%edi
mov    $0x0,%al
call   *-0x10(%rbp)
cmp    $0xffffffff,%eax
jne    159c <format+0x46c>
movl   $0xffffffff,-0x4(%rbp)
jmp    15ed <format+0x4bd>
jmp    15a1 <format+0x471>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1569 <format+0x439>
jmp    15b4 <format+0x484>
jmp    15e2 <format+0x4b2>
mov    -0x10(%rbp),%rcx
mov    -0x24(%rbp),%edi
mov    $0x0,%al
call   *%rcx
cmp    $0xffffffff,%eax
jne    15d9 <format+0x4a9>
movl   $0xffffffff,-0x4(%rbp)
jmp    15ed <format+0x4bd>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1156 <format+0x26>
mov    -0x34(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x130,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<format>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xf8,%rsp
mov    %rdx,0x8(%rsp)
mov    %rsi,%rbx
mov    %rdi,%r15
xor    %r12d,%r12d
add    $0x2,%rbx
mov    %r12d,%r13d
cs nopw 0x0(%rax,%rax,1)
movsbl -0x2(%rbx),%edi
test   %edi,%edi
je     1422 <format+0x302>
cmp    $0x25,%dil
je     1180 <format+0x60>
xor    %eax,%eax
call   *%r15
cmp    $0xffffffff,%eax
je     141c <format+0x2fc>
add    $0x1,%r13d
add    $0x1,%rbx
jmp    1150 <format+0x30>
nopw   0x0(%rax,%rax,1)
movb   $0x0,0x3e(%rsp)
mov    -0x1(%rbx),%r9b
cmp    $0x2d,%r9b
jne    1197 <format+0x77>
mov    (%rbx),%al
add    $0x1,%rbx
jmp    119a <format+0x7a>
mov    %r9d,%eax
mov    0x8(%rsp),%r8
mov    $0x20,%edx
cmp    $0x30,%al
jne    11b3 <format+0x93>
mov    (%rbx),%al
add    $0x1,%rbx
mov    $0x30,%edx
cmp    $0x2a,%al
jne    11c7 <format+0xa7>
mov    (%r8),%ebp
add    $0x4,%r8
movsbl (%rbx),%eax
add    $0x1,%rbx
jmp    11f9 <format+0xd9>
movsbl %al,%eax
lea    -0x30(%rax),%ecx
xor    %ebp,%ebp
cmp    $0x9,%ecx
ja     11f9 <format+0xd9>
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
lea    0x0(%rbp,%rbp,4),%ecx
lea    (%rax,%rcx,2),%ebp
add    $0xffffffd0,%ebp
movsbl (%rbx),%eax
add    $0x1,%rbx
lea    -0x30(%rax),%ecx
cmp    $0xa,%ecx
jb     11e0 <format+0xc0>
mov    $0x2710,%esi
cmp    $0x2e,%eax
jne    1250 <format+0x130>
movsbl (%rbx),%eax
cmp    $0x2a,%eax
jne    121c <format+0xfc>
mov    (%r8),%esi
add    $0x4,%r8
movsbl 0x1(%rbx),%eax
add    $0x2,%rbx
jmp    1250 <format+0x130>
add    $0x1,%rbx
lea    -0x30(%rax),%ecx
xor    %esi,%esi
cmp    $0x9,%ecx
ja     1250 <format+0x130>
xor    %esi,%esi
nopl   0x0(%rax)
lea    (%rsi,%rsi,4),%ecx
lea    (%rax,%rcx,2),%esi
add    $0xffffffd0,%esi
movsbl (%rbx),%eax
add    $0x1,%rbx
lea    -0x30(%rax),%ecx
cmp    $0xa,%ecx
jb     1230 <format+0x110>
nopl   0x0(%rax,%rax,1)
cmp    $0x6c,%eax
mov    %edx,0x10(%rsp)
je     126c <format+0x14c>
mov    $0x4,%r12d
cmp    $0x68,%eax
jne    1279 <format+0x159>
mov    $0x4,%r12d
jmp    1272 <format+0x152>
mov    $0x8,%r12d
movsbl (%rbx),%eax
add    $0x1,%rbx
lea    -0x63(%rax),%edi
cmp    $0x15,%edi
mov    %r9b,0x7(%rsp)
mov    %rsi,0x20(%rsp)
ja     12a7 <format+0x187>
mov    $0x8,%esi
lea    0xd69(%rip),%rdx
movslq (%rdx,%rdi,4),%rdi
add    %rdx,%rdi
jmp    *%rdi
mov    (%r8),%eax
add    $0x4,%r8
mov    %al,0x3d(%rsp)
lea    0x3d(%rsp),%rcx
lea    0x3e(%rsp),%r14
jmp    1316 <format+0x1f6>
mov    $0xfffffff6,%esi
jmp    12ec <format+0x1cc>
mov    (%r8),%r12
add    $0x8,%r8
mov    %r12,%rdi
mov    %r8,%r14
call   1030 <strlen@plt>
mov    %r12,%rcx
mov    %r14,%r8
mov    0x7(%rsp),%r9b
mov    %rax,%r14
jmp    1319 <format+0x1f9>
mov    $0xa,%esi
jmp    12ec <format+0x1cc>
mov    $0x10,%esi
mov    %r8,%rdi
lea    0x3e(%rsp),%r14
mov    %r14,%rdx
mov    %r12d,%ecx
xor    %eax,%eax
mov    %r8,0x8(%rsp)
call   1040 <fmtcvt@plt>
mov    0x7(%rsp),%r9b
movslq %eax,%rcx
mov    %r12d,%r8d
add    0x8(%rsp),%r8
sub    %rcx,%r14
mov    0x10(%rsp),%r12d
mov    0x20(%rsp),%rax
cmp    %r14d,%eax
cmovl  %eax,%r14d
cmp    $0x2d,%r9b
mov    %r8,0x8(%rsp)
mov    %r14,0x18(%rsp)
je     137c <format+0x25c>
mov    %ebp,%eax
sub    %r14d,%eax
jle    1379 <format+0x259>
mov    %rcx,0x28(%rsp)
add    %eax,%r13d
add    $0xffffffff,%r14d
nopl   (%rax)
mov    %r12d,%edi
xor    %eax,%eax
call   *%r15
cmp    $0xffffffff,%eax
je     141c <format+0x2fc>
add    $0xffffffff,%ebp
cmp    0x18(%rsp),%ebp
jg     1350 <format+0x230>
mov    %r14d,%ebp
mov    0x7(%rsp),%r9b
mov    0x28(%rsp),%rcx
jmp    137c <format+0x25c>
add    $0xffffffff,%ebp
mov    (%rcx),%al
xor    %r14d,%r14d
test   %al,%al
mov    0x20(%rsp),%r12
je     13d1 <format+0x2b1>
test   %r12d,%r12d
jle    13d1 <format+0x2b1>
mov    %r15,0x10(%rsp)
xor    %r14d,%r14d
nopw   0x0(%rax,%rax,1)
mov    %rcx,%r15
movsbl %al,%edi
xor    %eax,%eax
call   *0x10(%rsp)
cmp    $0xffffffff,%eax
je     141c <format+0x2fc>
movzbl 0x1(%r15,%r14,1),%eax
add    $0x1,%r14
test   %al,%al
je     13c7 <format+0x2a7>
mov    %r15,%rcx
cmp    %r12d,%r14d
jl     13a0 <format+0x280>
mov    0x7(%rsp),%r9b
mov    0x10(%rsp),%r15
lea    (%r14,%r13,1),%r12d
cmp    $0x2d,%r9b
jne    113f <format+0x1f>
cmp    0x18(%rsp),%ebp
jle    113f <format+0x1f>
add    %ebp,%r13d
add    %r14d,%r13d
mov    %r13d,%r12d
mov    0x18(%rsp),%r14
sub    %r14d,%r12d
nopw   0x0(%rax,%rax,1)
mov    $0x20,%edi
xor    %eax,%eax
call   *%r15
cmp    $0xffffffff,%eax
je     141c <format+0x2fc>
add    $0xffffffff,%ebp
cmp    %r14d,%ebp
jg     1400 <format+0x2e0>
jmp    113f <format+0x1f>
mov    $0xffffffff,%r13d
mov    %r13d,%eax
add    $0xf8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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