#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 /*<<< orphan*/ putchar_unlocked(long long);
void printInt(int x) {
  if (x == 0) {
    putchar_unlocked('0');
    return;
  }
  long long x_ = x;
  if (x_ < 0) {
    putchar_unlocked('-');
    x_ = -x_;
  }
  long long rev = x_;
  int zeros = 0;
  while (rev % 10 == 0) {
    rev /= 10;
    ++zeros;
  }
  rev = 0;
  while (x_) {
    rev = 10 * rev + x_ % 10;
    x_ /= 10;
  }
  while (rev) {
    putchar_unlocked('0' + rev % 10);
    rev /= 10;
  }
  while (zeros--) {
    putchar_unlocked('0');
  }
}


x86 assembly (clang, -O0):
<printInt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0x4(%rbp)
cmpl   $0x0,-0x4(%rbp)
jne    1134 <printInt+0x24>
mov    $0x30,%edi
call   1030 <putchar_unlocked@plt>
jmp    1257 <printInt+0x147>
movslq -0x4(%rbp),%rax
mov    %rax,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jge    115b <printInt+0x4b>
mov    $0x2d,%edi
call   1030 <putchar_unlocked@plt>
xor    %eax,%eax
sub    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
cmp    $0x0,%rdx
jne    11a2 <printInt+0x92>
mov    -0x18(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    116a <printInt+0x5a>
movq   $0x0,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     11ee <printInt+0xde>
imul   $0xa,-0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    -0x28(%rbp),%rax
add    %rdx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,-0x10(%rbp)
jmp    11aa <printInt+0x9a>
jmp    11f3 <printInt+0xe3>
cmpq   $0x0,-0x18(%rbp)
je     122f <printInt+0x11f>
mov    -0x18(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rdx,%rdi
add    $0x30,%rdi
call   1030 <putchar_unlocked@plt>
mov    -0x18(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,-0x18(%rbp)
jmp    11f3 <printInt+0xe3>
jmp    1234 <printInt+0x124>
mov    -0x1c(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x1c(%rbp)
cmp    $0x0,%eax
je     1257 <printInt+0x147>
mov    $0x30,%edi
call   1030 <putchar_unlocked@plt>
jmp    1234 <printInt+0x124>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<printInt>:
test   %edi,%edi
je     124a <printInt+0x13a>
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
movslq %edi,%r14
jns    1131 <printInt+0x21>
mov    $0x2d,%edi
call   1030 <putchar_unlocked@plt>
neg    %r14
movabs $0xcccccccccccccccd,%rcx
cc cc cc
mov    %r14,%rax
imul   %rcx,%rax
movabs $0x1999999999999998,%rsi
99 99 19
add    %rsi,%rax
ror    %rax
xor    %ebp,%ebp
movabs $0x6666666666666667,%r15
66 66 66
cmp    %rsi,%rax
ja     11a9 <printInt+0x99>
xor    %ebp,%ebp
movabs $0x1999999999999999,%rdi
99 99 19
mov    %r14,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %rdx,%rax
imul   %r15
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x2,%rdx
add    %rax,%rdx
add    $0x1,%ebp
mov    %rdx,%rax
imul   %rcx,%rax
add    %rsi,%rax
ror    %rax
cmp    %rdi,%rax
jb     1180 <printInt+0x70>
test   %r14,%r14
je     122c <printInt+0x11c>
xor    %ebx,%ebx
lea    (%rbx,%rbx,4),%rcx
mov    %r14,%rax
imul   %r15
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x2,%rdx
add    %rax,%rdx
lea    (%rdx,%rdx,1),%rax
lea    (%rax,%rax,4),%rax
mov    %r14,%rsi
sub    %rax,%rsi
lea    (%rsi,%rcx,2),%rbx
add    $0x9,%r14
cmp    $0x13,%r14
mov    %rdx,%r14
jae    11b0 <printInt+0xa0>
test   %rbx,%rbx
je     122c <printInt+0x11c>
nopl   0x0(%rax)
mov    %rbx,%rax
imul   %r15
mov    %rdx,%r14
mov    %rdx,%rax
shr    $0x3f,%rax
sar    $0x2,%r14
add    %rax,%r14
lea    (%r14,%r14,1),%rax
lea    (%rax,%rax,4),%rax
neg    %rax
lea    (%rbx,%rax,1),%rdi
add    $0x30,%rdi
call   1030 <putchar_unlocked@plt>
add    $0x9,%rbx
cmp    $0x13,%rbx
mov    %r14,%rbx
jae    11f0 <printInt+0xe0>
test   %ebp,%ebp
je     123f <printInt+0x12f>
mov    $0x30,%edi
call   1030 <putchar_unlocked@plt>
add    $0xffffffff,%ebp
jne    1230 <printInt+0x120>
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0x30,%edi
jmp    1030 <putchar_unlocked@plt>

LLVM IR (-O0):
define void @printInt(i32 %0) {
%2 = alloca i32
%3 = alloca i64
%4 = alloca i64
%5 = alloca i32
store i32 %0, i32* %2
%6 = load i32, i32* %2
%7 = icmp eq i32 %6, 0
br i1 %7, label %8, label %10
8: ; preds = %1
%9 = call i32 @putchar_unlocked(i64 48)
br label %60
10: ; preds = %1
%11 = load i32, i32* %2
%12 = sext i32 %11 to i64
store i64 %12, i64* %3
%13 = load i64, i64* %3
%14 = icmp slt i64 %13, 0
br i1 %14, label %15, label %19
15: ; preds = %10
%16 = call i32 @putchar_unlocked(i64 45)
%17 = load i64, i64* %3
%18 = sub nsw i64 0, %17
store i64 %18, i64* %3
br label %19
19: ; preds = %15, %10
%20 = load i64, i64* %3
store i64 %20, i64* %4
store i32 0, i32* %5
br label %21
21: ; preds = %25, %19
%22 = load i64, i64* %4
%23 = srem i64 %22, 10
%24 = icmp eq i64 %23, 0
br i1 %24, label %25, label %30
25: ; preds = %21
%26 = load i64, i64* %4
%27 = sdiv i64 %26, 10
store i64 %27, i64* %4
%28 = load i32, i32* %5
%29 = add nsw i32 %28, 1
store i32 %29, i32* %5
br label %21
30: ; preds = %21
store i64 0, i64* %4
br label %31
31: ; preds = %34, %30
%32 = load i64, i64* %3
%33 = icmp ne i64 %32, 0
br i1 %33, label %34, label %42
34: ; preds = %31
%35 = load i64, i64* %4
%36 = mul nsw i64 10, %35
%37 = load i64, i64* %3
%38 = srem i64 %37, 10
%39 = add nsw i64 %36, %38
store i64 %39, i64* %4
%40 = load i64, i64* %3
%41 = sdiv i64 %40, 10
store i64 %41, i64* %3
br label %31
42: ; preds = %31
br label %43
43: ; preds = %46, %42
%44 = load i64, i64* %4
%45 = icmp ne i64 %44, 0
br i1 %45, label %46, label %53
46: ; preds = %43
%47 = load i64, i64* %4
%48 = srem i64 %47, 10
%49 = add nsw i64 48, %48
%50 = call i32 @putchar_unlocked(i64 %49)
%51 = load i64, i64* %4
%52 = sdiv i64 %51, 10
store i64 %52, i64* %4
br label %43
53: ; preds = %43
br label %54
54: ; preds = %58, %53
%55 = load i32, i32* %5
%56 = add nsw i32 %55, -1
store i32 %56, i32* %5
%57 = icmp ne i32 %55, 0
br i1 %57, label %58, label %60
58: ; preds = %54
%59 = call i32 @putchar_unlocked(i64 48)
br label %54
60: ; preds = %8, %54
ret void
}

LLVM IR (-O2):
define void @printInt(i32 %0) {
%2 = icmp eq i32 %0, 0
br i1 %2, label %3, label %5
3: ; preds = %1
%4 = tail call i32 @putchar_unlocked(i64 48)
br label %51
5: ; preds = %1
%6 = sext i32 %0 to i64
%7 = icmp slt i32 %0, 0
br i1 %7, label %8, label %11
8: ; preds = %5
%9 = tail call i32 @putchar_unlocked(i64 45)
%10 = sub nsw i64 0, %6
br label %11
11: ; preds = %8, %5
%12 = phi i64 [ %10, %8 ], [ %6, %5 ]
%13 = srem i64 %12, 10
%14 = icmp eq i64 %13, 0
br i1 %14, label %18, label %15
15: ; preds = %18, %11
%16 = phi i32 [ 0, %11 ], [ %22, %18 ]
%17 = icmp eq i64 %12, 0
br i1 %17, label %36, label %27
18: ; preds = %11, %18
%19 = phi i32 [ %22, %18 ], [ 0, %11 ]
%20 = phi i64 [ %21, %18 ], [ %12, %11 ]
%21 = sdiv i64 %20, 10
%22 = add nuw nsw i32 %19, 1
%23 = srem i64 %21, 10
%24 = icmp eq i64 %23, 0
br i1 %24, label %18, label %15
25: ; preds = %27
%26 = icmp eq i64 %32, 0
br i1 %26, label %36, label %38
27: ; preds = %15, %27
%28 = phi i64 [ %32, %27 ], [ 0, %15 ]
%29 = phi i64 [ %33, %27 ], [ %12, %15 ]
%30 = mul nsw i64 %28, 10
%31 = srem i64 %29, 10
%32 = add nsw i64 %30, %31
%33 = sdiv i64 %29, 10
%34 = add nsw i64 %29, 9
%35 = icmp ult i64 %34, 19
br i1 %35, label %25, label %27
36: ; preds = %38, %15, %25
%37 = icmp eq i32 %16, 0
br i1 %37, label %51, label %46
38: ; preds = %25, %38
%39 = phi i64 [ %43, %38 ], [ %32, %25 ]
%40 = srem i64 %39, 10
%41 = add nsw i64 %40, 48
%42 = tail call i32 @putchar_unlocked(i64 %41)
%43 = sdiv i64 %39, 10
%44 = add i64 %39, 9
%45 = icmp ult i64 %44, 19
br i1 %45, label %36, label %38
46: ; preds = %36, %46
%47 = phi i32 [ %48, %46 ], [ %16, %36 ]
%48 = add nsw i32 %47, -1
%49 = tail call i32 @putchar_unlocked(i64 48)
%50 = icmp eq i32 %48, 0
br i1 %50, label %51, label %46
51: ; preds = %46, %36, %3
ret void
}