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

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int itostr(char *buf, size_t len, int n) {
  short i;
  short w = 0;
  short s = n < 0 ? 1 : 0;
  n = n < 0 ? -n : n;
  len--;
  do {
    for (i = w < len ? w : len; i >= 1; i--)
      buf[i] = buf[i - 1];
    buf[0] = '0' + (n % 10);
    w++;
    n /= 10;
  } while (n);
  if (s) {
    for (i = w < len ? w : len; i >= 1; i--)
      buf[i] = buf[i - 1];
    buf[0] = '-';
    w++;
  }
  len++;
  return w < len ? w : len;
}


x86 assembly (clang, -O0):
<itostr>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movw   $0x0,-0x18(%rbp)
mov    -0x14(%rbp),%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%edx
cmovl  %ecx,%eax
mov    %ax,-0x1a(%rbp)
cmpl   $0x0,-0x14(%rbp)
jge    1140 <itostr+0x40>
xor    %eax,%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    1146 <itostr+0x46>
mov    -0x14(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
movswq -0x18(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    1175 <itostr+0x75>
movswq -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
jmp    117d <itostr+0x7d>
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %ax,-0x16(%rbp)
movswl -0x16(%rbp),%eax
cmp    $0x1,%eax
jl     11c0 <itostr+0xc0>
mov    -0x8(%rbp),%rax
movswl -0x16(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
movswq -0x16(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x16(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x16(%rbp)
jmp    1185 <itostr+0x85>
mov    -0x14(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
mov    -0x18(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x18(%rbp)
mov    -0x14(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1158 <itostr+0x58>
cmpw   $0x0,-0x1a(%rbp)
je     1280 <itostr+0x180>
movswq -0x18(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    1222 <itostr+0x122>
movswq -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
jmp    122a <itostr+0x12a>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %ax,-0x16(%rbp)
movswl -0x16(%rbp),%eax
cmp    $0x1,%eax
jl     126d <itostr+0x16d>
mov    -0x8(%rbp),%rax
movswl -0x16(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
movswq -0x16(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x16(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x16(%rbp)
jmp    1232 <itostr+0x132>
mov    -0x8(%rbp),%rax
movb   $0x2d,(%rax)
mov    -0x18(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
movswq -0x18(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    12a9 <itostr+0x1a9>
movswq -0x18(%rbp),%rax
mov    %rax,-0x38(%rbp)
jmp    12b1 <itostr+0x1b1>
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<itostr>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    $0xffffffff,%r14d
mov    %edx,%r10d
neg    %r10d
mov    %edx,-0xc(%rsp)
cmovs  %edx,%r10d
mov    %rsi,-0x8(%rsp)
lea    -0x1(%rsi),%r8
lea    0x1(%rdi),%rsi
mov    $0x1,%bx
xor    %ecx,%ecx
jmp    117e <itostr+0x7e>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movslq %r10d,%rax
imul   $0x66666667,%rax,%r10
mov    %r10,%rcx
shr    $0x3f,%rcx
sar    $0x22,%r10
add    %ecx,%r10d
lea    (%r10,%r10,1),%ecx
lea    (%rcx,%rcx,4),%ecx
mov    %eax,%ebp
sub    %ecx,%ebp
add    $0x30,%bpl
mov    %bpl,(%rdi)
lea    0x1(%r11),%ecx
add    $0x9,%eax
lea    0x1(%r9),%ebx
cmp    $0x12,%eax
jbe    12c4 <itostr+0x1c4>
mov    %ebx,%r9d
movswq %cx,%r11
cmp    %r11,%r8
mov    %r11,%r15
cmovb  %r8,%r15
mov    %r8d,%ecx
cmova  %r11d,%ecx
test   %cx,%cx
jle    1140 <itostr+0x40>
movzwl %r15w,%r12d
cmp    %r11,%r8
mov    %r11,%rcx
cmovb  %r8,%rcx
movzwl %cx,%ebx
cmp    $0x4,%r12d
jae    11e0 <itostr+0xe0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    (%rbx,%r14,1),%eax
movzbl (%rdi,%rax,1),%eax
mov    %al,(%rdi,%rbx,1)
lea    -0x1(%rbx),%rax
cmp    $0x1,%rbx
mov    %rax,%rbx
ja     11c0 <itostr+0xc0>
jmp    1140 <itostr+0x40>
nopl   (%rax)
lea    -0x1(%r12),%rcx
movzwl %r15w,%ebp
add    $0xffffffff,%ebp
cmp    %ecx,%ebp
jb     11c0 <itostr+0xc0>
shr    $0x20,%rcx
jne    11c0 <itostr+0xc0>
lea    (%rdi,%r12,1),%rcx
cmp    %rcx,%rsi
ja     11c0 <itostr+0xc0>
add    %rdi,%rbp
mov    %rbp,%rcx
sub    %r12,%rcx
add    $0x1,%rcx
cmp    %rbp,%rcx
ja     11c0 <itostr+0xc0>
lea    (%r14,%r12,1),%ecx
lea    (%rsi,%rcx,1),%rbp
cmp    %rbp,%rsi
jae    122d <itostr+0x12d>
lea    (%rsi,%r12,1),%rbp
sub    %r12,%rcx
add    %rsi,%rcx
cmp    %rbp,%rcx
jb     11c0 <itostr+0xc0>
cmp    $0x10,%r12d
jae    1237 <itostr+0x137>
xor    %edx,%edx
jmp    127e <itostr+0x17e>
mov    %r15d,%ebp
and    $0xf,%ebp
mov    %r15d,%r13d
and    $0xf,%r13d
mov    %r12,%rdx
sub    %r13,%rdx
mov    %r12,%rcx
nopl   (%rax)
lea    (%rcx,%r14,1),%eax
movups -0xf(%rdi,%rax,1),%xmm0
movups %xmm0,-0xf(%rdi,%rcx,1)
add    $0xfffffffffffffff0,%rcx
cmp    %rcx,%rbp
jne    1250 <itostr+0x150>
test   %r13,%r13
je     1140 <itostr+0x40>
cmp    $0x4,%r13d
jae    127e <itostr+0x17e>
sub    %rdx,%rbx
jmp    11c0 <itostr+0xc0>
mov    %r15d,%r13d
and    $0x3,%r13d
and    $0x3,%r15d
mov    %r15,%rax
sub    %r12,%rax
add    %rax,%rbx
sub    %rdx,%r12
cs nopw 0x0(%rax,%rax,1)
nop
lea    (%r12,%r14,1),%eax
mov    -0x3(%rdi,%rax,1),%eax
mov    %eax,-0x3(%rdi,%r12,1)
add    $0xfffffffffffffffc,%r12
cmp    %r12,%r13
jne    12a0 <itostr+0x1a0>
test   %r15,%r15
jne    11c0 <itostr+0xc0>
jmp    1140 <itostr+0x40>
cmpl   $0x0,-0xc(%rsp)
jns    1452 <itostr+0x352>
movswq %cx,%rcx
cmp    %rcx,%r8
cmovbe %r8,%rcx
test   %cx,%cx
jle    1448 <itostr+0x348>
movzwl %cx,%eax
cmp    $0x4,%rax
jae    12f4 <itostr+0x1f4>
mov    %rax,%rsi
jmp    1430 <itostr+0x330>
lea    -0x1(%rax),%rbp
movzwl %cx,%ebx
add    $0xffffffff,%ebx
cmp    %ebp,%ebx
jb     141a <itostr+0x31a>
shr    $0x20,%rbp
jne    141f <itostr+0x31f>
lea    (%rdi,%rax,1),%rbp
cmp    %rbp,%rsi
ja     1375 <itostr+0x275>
mov    %rsi,%rdx
add    %rdi,%rbx
mov    %rbx,%rsi
sub    %rax,%rsi
add    $0x1,%rsi
cmp    %rbx,%rsi
ja     1360 <itostr+0x260>
movzwl %cx,%esi
add    %r14d,%esi
lea    (%rdi,%rsi,1),%rbp
add    $0x1,%rbp
cmp    %rbp,%rdx
jae    1368 <itostr+0x268>
lea    (%rax,%rdi,1),%rdx
add    $0x1,%rdx
add    $0x1,%rsi
sub    %rax,%rsi
add    %rdi,%rsi
cmp    %rdx,%rsi
jae    1368 <itostr+0x268>
mov    %rax,%rsi
jmp    1430 <itostr+0x330>
mov    %rax,%rsi
jmp    1430 <itostr+0x330>
movswq %r9w,%r9
cmp    $0x10,%eax
jae    137d <itostr+0x27d>
xor    %eax,%eax
jmp    13d1 <itostr+0x2d1>
mov    %rax,%rsi
jmp    1430 <itostr+0x330>
mov    %ecx,%esi
and    $0xf,%esi
sub    %rsi,%rax
cmp    %r9,%r8
mov    %r9,%rbx
cmovb  %r8,%rbx
movzwl %bx,%r15d
and    $0xf,%ebx
sub    %r15,%rbx
lea    (%rdi,%r15,1),%r10
add    $0xfffffffffffffff1,%r10
add    %r14,%r15
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
lea    (%r15,%rbp,1),%edx
movups -0xf(%rdi,%rdx,1),%xmm0
movups %xmm0,(%r10,%rbp,1)
add    $0xfffffffffffffff0,%rbp
cmp    %rbp,%rbx
jne    13b0 <itostr+0x2b0>
test   %rsi,%rsi
je     1448 <itostr+0x348>
cmp    $0x4,%esi
jb     1430 <itostr+0x330>
mov    %ecx,%esi
and    $0x3,%esi
cmp    %r9,%r8
cmovb  %r8,%r9
mov    %r9d,%ecx
and    $0x3,%ecx
movzwl %r9w,%ebp
sub    %rbp,%rcx
neg    %rax
lea    (%rdi,%rbp,1),%rbx
add    $0xfffffffffffffffd,%rbx
add    %r14,%rbp
nopl   0x0(%rax,%rax,1)
lea    (%rax,%rbp,1),%edx
mov    -0x3(%rdi,%rdx,1),%edx
mov    %edx,(%rbx,%rax,1)
add    $0xfffffffffffffffc,%rax
cmp    %rax,%rcx
jne    1400 <itostr+0x300>
test   %rsi,%rsi
jne    1430 <itostr+0x330>
jmp    1448 <itostr+0x348>
mov    %rax,%rsi
jmp    1430 <itostr+0x330>
mov    %rax,%rsi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    (%rsi,%r14,1),%eax
movzbl (%rdi,%rax,1),%eax
mov    %al,(%rdi,%rsi,1)
lea    -0x1(%rsi),%rax
cmp    $0x1,%rsi
mov    %rax,%rsi
ja     1430 <itostr+0x330>
movb   $0x2d,(%rdi)
add    $0x2,%r11d
mov    %r11d,%ecx
mov    -0x8(%rsp),%rax
movswq %cx,%rcx
cmp    %rax,%rcx
movswl %cx,%ecx
cmovb  %ecx,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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