char *number(char *str, long num, int base, int size, int precision, int type) {
  char c, sign, tmp[66];
  const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz";
  int i;
  if (type & 64)
    digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  if (type & 16)
    type &= ~1;
  if (base < 2 || base > 36)
    return 0;
  c = (type & 1) ? '0' : ' ';
  sign = 0;
  if (type & 2) {
    if (num < 0) {
      sign = '-';
      num = -num;
      size--;
    } else if (type & 4) {
      sign = '+';
      size--;
    } else if (type & 8) {
      sign = ' ';
      size--;
    }
  }
  if (type & 32) {
    if (base == 16)
      size -= 2;
    else if (base == 8)
      size--;
  }
  i = 0;
  if (num == 0)
    tmp[i++] = '0';
  else
    while (num != 0)
      tmp[i++] = digits[({
        int __res;
        __res = ((unsigned long)num) % (unsigned)base;
        num = ((unsigned long)num) / (unsigned)base;
        __res;
      })];
  if (i > precision)
    precision = i;
  size -= precision;
  if (!(type & (1 + 16)))
    while (size-- > 0)
      *str++ = ' ';
  if (sign)
    *str++ = sign;
  if (type & 32) {
    if (base == 8)
      *str++ = '0';
    else if (base == 16) {
      *str++ = '0';
      *str++ = digits[33];
    }
  }
  if (!(type & 16))
    while (size-- > 0)
      *str++ = c;
  while (i < precision--)
    *str++ = '0';
  while (i-- > 0)
    *str++ = tmp[i];
  while (size-- > 0)
    *str++ = ' ';
  return str;
}


x86 assembly (clang, -O0):
<number>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
mov    %r8d,-0x24(%rbp)
mov    %r9d,-0x28(%rbp)
lea    0xedb(%rip),%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%eax
and    $0x40,%eax
cmp    $0x0,%eax
je     1143 <number+0x43>
lea    0xee6(%rip),%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     115b <number+0x5b>
mov    -0x28(%rbp),%eax
and    $0xfffffffe,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x2,-0x1c(%rbp)
jl     116f <number+0x6f>
cmpl   $0x24,-0x1c(%rbp)
jle    117c <number+0x7c>
movq   $0x0,-0x8(%rbp)
jmp    14d0 <number+0x3d0>
mov    -0x28(%rbp),%edx
and    $0x1,%edx
mov    $0x20,%eax
mov    $0x30,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,-0x29(%rbp)
movb   $0x0,-0x2a(%rbp)
mov    -0x28(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     121b <number+0x11b>
cmpq   $0x0,-0x18(%rbp)
jge    11cf <number+0xcf>
movb   $0x2d,-0x2a(%rbp)
xor    %eax,%eax
sub    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1216 <number+0x116>
mov    -0x28(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     11f0 <number+0xf0>
movb   $0x2b,-0x2a(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1211 <number+0x111>
mov    -0x28(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     120c <number+0x10c>
movb   $0x20,-0x2a(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1211 <number+0x111>
jmp    1216 <number+0x116>
jmp    121b <number+0x11b>
mov    -0x28(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     125f <number+0x15f>
cmpl   $0x10,-0x1c(%rbp)
jne    1242 <number+0x142>
mov    -0x20(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    125a <number+0x15a>
cmpl   $0x8,-0x1c(%rbp)
jne    1255 <number+0x155>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    125a <number+0x15a>
jmp    125f <number+0x15f>
movl   $0x0,-0x7c(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    1288 <number+0x188>
mov    -0x7c(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x7c(%rbp)
cltq
movb   $0x30,-0x70(%rbp,%rax,1)
jmp    12fc <number+0x1fc>
jmp    128d <number+0x18d>
cmpq   $0x0,-0x18(%rbp)
je     12f7 <number+0x1f7>
mov    -0x78(%rbp),%rax
mov    %rax,-0x90(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
xor    %edx,%edx
div    %rcx
mov    %edx,%eax
mov    %eax,-0x80(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
xor    %edx,%edx
div    %rcx
mov    %rax,%rcx
mov    -0x90(%rbp),%rax
mov    %rcx,-0x18(%rbp)
mov    -0x80(%rbp),%ecx
mov    %ecx,-0x84(%rbp)
movslq -0x84(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x7c(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x7c(%rbp)
cltq
mov    %cl,-0x70(%rbp,%rax,1)
jmp    128d <number+0x18d>
jmp    12fc <number+0x1fc>
mov    -0x7c(%rbp),%eax
cmp    -0x24(%rbp),%eax
jle    130e <number+0x20e>
mov    -0x7c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x20(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
mov    -0x28(%rbp),%eax
and    $0x11,%eax
cmp    $0x0,%eax
jne    135d <number+0x25d>
jmp    132d <number+0x22d>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    1358 <number+0x258>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x20,(%rax)
jmp    132d <number+0x22d>
jmp    135d <number+0x25d>
cmpb   $0x0,-0x2a(%rbp)
je     137b <number+0x27b>
mov    -0x2a(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x28(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     13e9 <number+0x2e9>
cmpl   $0x8,-0x1c(%rbp)
jne    13ab <number+0x2ab>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    13e4 <number+0x2e4>
cmpl   $0x10,-0x1c(%rbp)
jne    13df <number+0x2df>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
mov    -0x78(%rbp),%rax
mov    0x21(%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13e4 <number+0x2e4>
jmp    13e9 <number+0x2e9>
mov    -0x28(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
jne    142f <number+0x32f>
jmp    13fd <number+0x2fd>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    142a <number+0x32a>
mov    -0x29(%rbp),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13fd <number+0x2fd>
jmp    142f <number+0x32f>
jmp    1434 <number+0x334>
mov    -0x7c(%rbp),%eax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0xffffffff,%edx
mov    %edx,-0x24(%rbp)
cmp    %ecx,%eax
jge    1461 <number+0x361>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    1434 <number+0x334>
jmp    1466 <number+0x366>
mov    -0x7c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x7c(%rbp)
cmp    $0x0,%eax
jle    1498 <number+0x398>
movslq -0x7c(%rbp),%rax
mov    -0x70(%rbp,%rax,1),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1466 <number+0x366>
jmp    149d <number+0x39d>
mov    -0x20(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x20(%rbp)
cmp    $0x0,%eax
jle    14c8 <number+0x3c8>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x20,(%rax)
jmp    149d <number+0x39d>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<number>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x68,%rsp
mov    %r9d,%r13d
mov    %ecx,%r14d
mov    %edx,%r9d
test   $0x40,%r13b
lea    0xece(%rip),%rax
lea    0xeec(%rip),%rcx
cmove  %rax,%rcx
mov    %r13d,%ebx
and    $0xfffffffe,%ebx
test   $0x10,%r13b
cmove  %r13d,%ebx
lea    -0x25(%r9),%eax
cmp    $0xffffffdd,%eax
jae    115b <number+0x4b>
xor    %ebx,%ebx
jmp    13c5 <number+0x2b5>
mov    %rdi,%rbp
mov    $0x1,%r10b
test   $0x2,%bl
jne    1170 <number+0x60>
xor    %r11d,%r11d
test   $0x20,%bl
je     11b3 <number+0xa3>
jmp    11a3 <number+0x93>
test   %rsi,%rsi
js     1188 <number+0x78>
test   $0x4,%bl
jne    1194 <number+0x84>
test   $0x8,%bl
je     1166 <number+0x56>
add    $0xffffffff,%r14d
mov    $0x20,%r11b
jmp    119b <number+0x8b>
neg    %rsi
add    $0xffffffff,%r14d
mov    $0x2d,%r11b
jmp    119b <number+0x8b>
add    $0xffffffff,%r14d
mov    $0x2b,%r11b
xor    %r10d,%r10d
test   $0x20,%bl
je     11b3 <number+0xa3>
cmp    $0x8,%r9d
je     11ee <number+0xde>
cmp    $0x10,%r9d
jne    11b3 <number+0xa3>
add    $0xfffffffe,%r14d
test   %rsi,%rsi
je     11f7 <number+0xe7>
mov    %r9d,%edi
xor    %r15d,%r15d
jmp    11dd <number+0xcd>
mov    %rsi,%rax
xor    %edx,%edx
div    %rdi
movzbl (%rcx,%rdx,1),%edx
mov    %dl,0x20(%rsp,%r15,1)
add    $0x1,%r15
cmp    %rdi,%rsi
mov    %rax,%rsi
jb     1202 <number+0xf2>
mov    %rsi,%rax
shr    $0x20,%rax
jne    11c0 <number+0xb0>
mov    %esi,%eax
xor    %edx,%edx
div    %edi
jmp    11c8 <number+0xb8>
add    $0xffffffff,%r14d
test   %rsi,%rsi
jne    11b8 <number+0xa8>
movb   $0x30,0x20(%rsp)
mov    $0x1,%r15d
cmp    %r8d,%r15d
mov    %r8d,%r12d
cmovg  %r15d,%r12d
sub    %r12d,%r14d
test   $0x11,%bl
je     1220 <number+0x110>
test   %r10b,%r10b
je     127b <number+0x16b>
test   $0x20,%bl
jne    1288 <number+0x178>
jmp    129c <number+0x18c>
lea    -0x1(%r14),%eax
test   %r14d,%r14d
jle    1495 <number+0x385>
mov    %eax,%r14d
lea    0x1(%r14),%rdx
mov    %rbp,%rdi
mov    $0x20,%esi
mov    %r8d,0x14(%rsp)
mov    %r9,0x18(%rsp)
mov    %r10d,0x10(%rsp)
mov    %r11d,0xc(%rsp)
call   1030 <memset@plt>
mov    0xc(%rsp),%r11d
mov    0x10(%rsp),%r10d
mov    0x18(%rsp),%r9
mov    0x14(%rsp),%r8d
add    %r14,%rbp
add    $0x1,%rbp
mov    $0xffffffff,%r14d
test   %r10b,%r10b
jne    1219 <number+0x109>
mov    %r11b,0x0(%rbp)
add    $0x1,%rbp
test   $0x20,%bl
je     129c <number+0x18c>
cmp    $0x10,%r9d
je     12de <number+0x1ce>
cmp    $0x8,%r9d
jne    129c <number+0x18c>
movb   $0x30,0x0(%rbp)
add    $0x1,%rbp
test   $0x10,%bl
jne    12fa <number+0x1ea>
lea    -0x1(%r14),%r13d
test   %r14d,%r14d
jle    12d9 <number+0x1c9>
and    $0x1,%bl
shl    $0x4,%bl
or     $0x20,%bl
mov    %r14d,%edx
movzbl %bl,%esi
mov    %rbp,%rdi
mov    %r8d,%ebx
call   1030 <memset@plt>
mov    %ebx,%r8d
mov    %r13d,%eax
add    %rax,%rbp
add    $0x1,%rbp
mov    $0xffffffff,%r14d
jmp    12fa <number+0x1ea>
mov    %r13d,%r14d
jmp    12fa <number+0x1ea>
test   $0x40,%r13b
sete   %al
movb   $0x30,0x0(%rbp)
shl    $0x5,%al
or     $0x58,%al
mov    %al,0x1(%rbp)
add    $0x2,%rbp
test   $0x10,%bl
je     12a1 <number+0x191>
cmp    %r8d,%r15d
jge    1320 <number+0x210>
mov    %r15d,%eax
not    %eax
add    %eax,%r12d
lea    0x1(%r12),%rdx
mov    %rbp,%rdi
mov    $0x30,%esi
call   1030 <memset@plt>
add    %r12,%rbp
add    $0x1,%rbp
mov    %r15d,%eax
test   %r15d,%r15d
mov    $0x1,%edx
mov    $0x1,%esi
cmovle %r15d,%esi
mov    %r15d,%r8d
sub    %esi,%r8d
cmp    $0x1f,%r8d
jb     1376 <number+0x266>
test   %r15d,%r15d
cmovle %r15d,%edx
lea    -0x1(%r15),%esi
lea    0x20(%rsp),%rdi
add    %rsi,%rdi
add    $0x1,%rdi
cmp    %rdi,%rbp
jae    13d7 <number+0x2c7>
sub    %edx,%r15d
lea    (%r15,%rbp,1),%rdx
add    $0x1,%rdx
sub    %r15,%rsi
add    %rsp,%rsi
add    $0x20,%rsi
cmp    %rdx,%rsi
jae    13d7 <number+0x2c7>
mov    %rax,%rdx
mov    %rbp,%rbx
lea    0x1(%rdx),%eax
add    $0xffffffff,%edx
lea    (%rsp,%rdx,1),%rcx
add    $0x20,%rcx
nopw   0x0(%rax,%rax,1)
movzbl (%rcx),%edx
mov    %dl,(%rbx)
add    $0x1,%rbx
add    $0xffffffff,%eax
add    $0xffffffffffffffff,%rcx
cmp    $0x1,%eax
jg     1390 <number+0x280>
test   %r14d,%r14d
jle    13c5 <number+0x2b5>
mov    %r14d,%edx
mov    %rbx,%rdi
mov    $0x20,%esi
call   1030 <memset@plt>
add    $0xffffffff,%r14d
add    %r14,%rbx
add    $0x1,%rbx
mov    %rbx,%rax
add    $0x68,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
add    $0x1,%r8
mov    %r8,%rsi
and    $0xffffffffffffffe0,%rsi
mov    %rax,%rdx
sub    %rsi,%rdx
lea    (%rsi,%rbp,1),%rbx
add    $0xffffffffffffffff,%rax
xor    %edi,%edi
pxor   %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
mov    %eax,%ecx
movdqu 0x1(%rsp,%rcx,1),%xmm1
movdqu 0x11(%rsp,%rcx,1),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm2,0x0(%rbp,%rdi,1)
movdqu %xmm1,0x10(%rbp,%rdi,1)
add    $0x20,%rdi
add    $0xffffffffffffffe0,%rax
cmp    %rdi,%rsi
jne    1400 <number+0x2f0>
cmp    %rsi,%r8
jne    137c <number+0x26c>
jmp    13a5 <number+0x295>
mov    %eax,%r14d
test   %r10b,%r10b
jne    1219 <number+0x109>
jmp    127b <number+0x16b>

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

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