#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 DBL_MAX_10_EXP;
double modf(double, double *);
char *cvt(double arg, int ndigits, int *decpt, int *sign, char *buf,
          int eflag) {
  int r2;
  double fi, fj;
  char *p, *p1;
  if (ndigits >= 2 * DBL_MAX_10_EXP + 10 - 1)
    ndigits = 2 * DBL_MAX_10_EXP + 10 - 2;
  r2 = 0;
  *sign = 0;
  p = &buf[0];
  if (arg < 0) {
    *sign = 1;
    arg = -arg;
  }
  arg = modf(arg, &fi);
  p1 = &buf[2 * DBL_MAX_10_EXP + 10];
  if (fi != 0) {
    p1 = &buf[2 * DBL_MAX_10_EXP + 10];
    while (fi != 0) {
      fj = modf(fi / 10, &fi);
      *--p1 = (int)((fj + .03) * 10) + '0';
      r2++;
    }
    while (p1 < &buf[2 * DBL_MAX_10_EXP + 10])
      *p++ = *p1++;
  } else if (arg > 0) {
    while ((fj = arg * 10) < 1) {
      arg = fj;
      r2--;
    }
  }
  p1 = &buf[ndigits];
  if (eflag == 0)
    p1 += r2;
  *decpt = r2;
  if (p1 < &buf[0]) {
    buf[0] = '\0';
    return buf;
  }
  while (p <= p1 && p < &buf[2 * DBL_MAX_10_EXP + 10]) {
    arg *= 10;
    arg = modf(arg, &fj);
    *p++ = (int)fj + '0';
  }
  if (p1 >= &buf[2 * DBL_MAX_10_EXP + 10]) {
    buf[2 * DBL_MAX_10_EXP + 10 - 1] = '\0';
    return buf;
  }
  p = p1;
  *p1 += 5;
  while (*p1 > '9') {
    *p1 = '0';
    if (p1 > buf)
      ++*--p1;
    else {
      *p1 = '1';
      (*decpt)++;
      if (eflag == 0) {
        if (p > buf)
          *p = '0';
        p++;
      }
    }
  }
  *p = '\0';
  return buf;
}


x86 assembly (clang, -O0):
<cvt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
movsd  %xmm0,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
mov    %r8d,-0x34(%rbp)
mov    -0x14(%rbp),%eax
mov    0x2eb6(%rip),%rcx
mov    (%rcx),%ecx
shl    $0x1,%ecx
add    $0xa,%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jl     1162 <cvt+0x52>
mov    0x2e9c(%rip),%rax
mov    (%rax),%eax
shl    $0x1,%eax
add    $0xa,%eax
sub    $0x2,%eax
mov    %eax,-0x14(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x28(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,-0x50(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    11b4 <cvt+0xa4>
mov    -0x28(%rbp),%rax
movl   $0x1,(%rax)
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
lea    -0x40(%rbp),%rdi
call   1030 <modf@plt>
movsd  %xmm0,-0x10(%rbp)
mov    -0x30(%rbp),%rax
mov    0x2e1e(%rip),%rcx
mov    (%rcx),%ecx
shl    $0x1,%ecx
add    $0xa,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1201 <cvt+0xf1>
jp     1201 <cvt+0xf1>
jmp    12f3 <cvt+0x1e3>
mov    -0x30(%rbp),%rax
mov    0x2de4(%rip),%rcx
mov    (%rcx),%ecx
shl    $0x1,%ecx
add    $0xa,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    123b <cvt+0x12b>
jp     123b <cvt+0x12b>
jmp    129c <cvt+0x18c>
movsd  -0x40(%rbp),%xmm0
movsd  0xdc0(%rip),%xmm1
divsd  %xmm1,%xmm0
lea    -0x40(%rbp),%rdi
call   1030 <modf@plt>
movsd  %xmm0,-0x48(%rbp)
movsd  0xdae(%rip),%xmm0
addsd  -0x48(%rbp),%xmm0
movsd  0xd99(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x58(%rbp),%rax
mov    %rax,%rdx
add    $0xffffffffffffffff,%rdx
mov    %rdx,-0x58(%rbp)
mov    %cl,-0x1(%rax)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    121e <cvt+0x10e>
jmp    12a1 <cvt+0x191>
mov    -0x58(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    0x2d40(%rip),%rdx
mov    (%rdx),%edx
shl    $0x1,%edx
add    $0xa,%edx
movslq %edx,%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jae    12ee <cvt+0x1de>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x58(%rbp)
mov    (%rax),%cl
mov    -0x50(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x50(%rbp)
mov    %cl,(%rax)
jmp    12a1 <cvt+0x191>
jmp    1350 <cvt+0x240>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    134b <cvt+0x23b>
jmp    130a <cvt+0x1fa>
movsd  0xcf6(%rip),%xmm1
mulsd  -0x10(%rbp),%xmm1
movsd  %xmm1,-0x48(%rbp)
movsd  0xcdc(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1346 <cvt+0x236>
movsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x38(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x38(%rbp)
jmp    130a <cvt+0x1fa>
jmp    134b <cvt+0x23b>
jmp    1350 <cvt+0x240>
mov    -0x30(%rbp),%rax
movslq -0x14(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
cmpl   $0x0,-0x34(%rbp)
jne    137a <cvt+0x26a>
mov    -0x38(%rbp),%ecx
mov    -0x58(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x38(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x58(%rbp),%rax
mov    -0x30(%rbp),%rcx
cmp    %rcx,%rax
jae    13a8 <cvt+0x298>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1537 <cvt+0x427>
jmp    13ad <cvt+0x29d>
mov    -0x50(%rbp),%rcx
xor    %eax,%eax
cmp    -0x58(%rbp),%rcx
mov    %al,-0x59(%rbp)
ja     13e6 <cvt+0x2d6>
mov    -0x50(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    0x2c21(%rip),%rdx
mov    (%rdx),%edx
shl    $0x1,%edx
add    $0xa,%edx
movslq %edx,%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
setb   %al
mov    %al,-0x59(%rbp)
mov    -0x59(%rbp),%al
test   $0x1,%al
jne    13f6 <cvt+0x2e6>
jmp    143b <cvt+0x32b>
movsd  0xc0a(%rip),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
lea    -0x48(%rbp),%rdi
call   1030 <modf@plt>
movsd  %xmm0,-0x10(%rbp)
cvttsd2si -0x48(%rbp),%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x50(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x50(%rbp)
mov    %cl,(%rax)
jmp    13ad <cvt+0x29d>
mov    -0x58(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    0x2ba6(%rip),%rdx
mov    (%rdx),%edx
shl    $0x1,%edx
add    $0xa,%edx
movslq %edx,%rdx
add    %rdx,%rcx
cmp    %rcx,%rax
jb     148b <cvt+0x37b>
mov    -0x30(%rbp),%rax
mov    0x2b84(%rip),%rcx
mov    (%rcx),%ecx
shl    $0x1,%ecx
add    $0xa,%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1537 <cvt+0x427>
mov    -0x58(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x58(%rbp),%rax
movsbl (%rax),%ecx
add    $0x5,%ecx
mov    %cl,(%rax)
mov    -0x58(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jle    1528 <cvt+0x418>
mov    -0x58(%rbp),%rax
movb   $0x30,(%rax)
mov    -0x58(%rbp),%rax
cmp    -0x30(%rbp),%rax
jbe    14e1 <cvt+0x3d1>
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x58(%rbp)
mov    -0x1(%rax),%cl
add    $0x1,%cl
mov    %cl,-0x1(%rax)
jmp    1523 <cvt+0x413>
mov    -0x58(%rbp),%rax
movb   $0x31,(%rax)
mov    -0x20(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
cmpl   $0x0,-0x34(%rbp)
jne    151e <cvt+0x40e>
mov    -0x50(%rbp),%rax
cmp    -0x30(%rbp),%rax
jbe    1512 <cvt+0x402>
mov    -0x50(%rbp),%rax
movb   $0x30,(%rax)
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
jmp    1523 <cvt+0x413>
jmp    149f <cvt+0x38f>
mov    -0x50(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cvt>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %r8d,%r13d
mov    %rcx,%r15
mov    %rsi,%rbx
mov    0x2ec2(%rip),%r12
mov    (%r12),%eax
lea    (%rax,%rax,1),%ecx
add    $0x9,%ecx
cmp    %edi,%ecx
lea    0x8(%rax,%rax,1),%ebp
cmovg  %edi,%ebp
movl   $0x0,(%rdx)
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jbe    115f <cvt+0x4f>
movl   $0x1,(%rdx)
xorpd  0xea1(%rip),%xmm0
lea    0x10(%rsp),%rdi
call   1030 <modf@plt>
movapd %xmm0,%xmm3
movsd  0x10(%rsp),%xmm0
ucomisd 0xead(%rip),%xmm0
mov    %rbx,0x20(%rsp)
jne    1188 <cvt+0x78>
jnp    1250 <cvt+0x140>
mov    %ebp,(%rsp)
movsd  %xmm3,0x18(%rsp)
mov    %r13d,0x4(%rsp)
movslq (%r12),%rax
lea    (%r15,%rax,2),%r13
add    $0xa,%r13
xor    %r14d,%r14d
lea    0x10(%rsp),%rbp
nopw   0x0(%rax,%rax,1)
movsd  0xe58(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    %rbp,%rdi
call   1030 <modf@plt>
movapd %xmm0,%xmm1
addsd  0xe50(%rip),%xmm0
mulsd  0xe38(%rip),%xmm0
cvttsd2si %xmm0,%eax
add    $0x30,%al
mov    %al,-0x1(%r13,%r14,1)
movsd  0x10(%rsp),%xmm0
add    $0xffffffffffffffff,%r14
ucomisd 0xe33(%rip),%xmm0
jne    11b0 <cvt+0xa0>
jp     11b0 <cvt+0xa0>
movslq (%r12),%rax
movsd  %xmm1,0x8(%rsp)
lea    (%r15,%rax,2),%rax
add    $0xa,%rax
add    %r14,%r13
neg    %r14
mov    %r15,%rbx
cmp    %rax,%r13
jae    1240 <cvt+0x130>
nopl   0x0(%rax)
movzbl 0x0(%r13),%eax
add    $0x1,%r13
mov    %al,(%rbx)
add    $0x1,%rbx
movslq (%r12),%rax
lea    (%r15,%rax,2),%rax
add    $0xa,%rax
cmp    %rax,%r13
jb     1220 <cvt+0x110>
mov    0x4(%rsp),%r13d
movsd  0x18(%rsp),%xmm3
mov    (%rsp),%ebp
jmp    129f <cvt+0x18f>
xor    %r14d,%r14d
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm3
jbe    129c <cvt+0x18c>
mov    $0x1,%r14d
movsd  0xda5(%rip),%xmm0
movsd  0xda5(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movapd %xmm3,%xmm2
mulsd  %xmm0,%xmm3
add    $0xffffffff,%r14d
ucomisd %xmm3,%xmm1
ja     1280 <cvt+0x170>
movsd  %xmm3,0x8(%rsp)
movapd %xmm2,%xmm3
mov    %r15,%rbx
movslq %ebp,%rax
add    %r15,%rax
xor    %ecx,%ecx
test   %r13d,%r13d
cmove  %r14d,%ecx
movslq %ecx,%rbp
add    %rax,%rbp
mov    0x20(%rsp),%rcx
mov    %r14d,(%rcx)
mov    %r15,%rax
cmp    %r15,%rbp
jb     13a0 <cvt+0x290>
cmp    %rbp,%rbx
ja     131c <cvt+0x20c>
lea    0x8(%rsp),%r14
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movslq (%r12),%rax
lea    (%r15,%rax,2),%rax
add    $0xa,%rax
cmp    %rax,%rbx
jae    131c <cvt+0x20c>
mulsd  0xd17(%rip),%xmm3
movapd %xmm3,%xmm0
mov    %r14,%rdi
call   1030 <modf@plt>
movapd %xmm0,%xmm3
cvttsd2si 0x8(%rsp),%eax
add    $0x30,%al
mov    %al,(%rbx)
add    $0x1,%rbx
cmp    %rbp,%rbx
jbe    12e0 <cvt+0x1d0>
movslq (%r12),%rax
lea    (%r15,%rax,2),%rcx
add    $0xa,%rcx
cmp    %rcx,%rbp
jae    138f <cvt+0x27f>
mov    0x0(%rbp),%al
add    $0x5,%al
mov    %al,0x0(%rbp)
cmp    $0x3a,%al
jl     139d <cvt+0x28d>
mov    %rbp,%rax
mov    0x20(%rsp),%rdx
jmp    1363 <cvt+0x253>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl -0x1(%rbp),%ecx
add    $0x1,%cl
mov    %cl,-0x1(%rbp)
add    $0xffffffffffffffff,%rbp
cmp    $0x39,%cl
jle    13a0 <cvt+0x290>
movb   $0x30,0x0(%rbp)
cmp    %r15,%rbp
ja     1350 <cvt+0x240>
movb   $0x31,0x0(%rbp)
addl   $0x1,(%rdx)
test   %r13d,%r13d
jne    1384 <cvt+0x274>
cmp    %r15,%rax
jbe    1380 <cvt+0x270>
movb   $0x30,(%rax)
add    $0x1,%rax
movzbl 0x0(%rbp),%ecx
cmp    $0x39,%cl
jg     1363 <cvt+0x253>
jmp    13a0 <cvt+0x290>
add    %rax,%rax
cltq
add    %r15,%rax
add    $0x9,%rax
jmp    13a0 <cvt+0x290>
mov    %rbp,%rax
movb   $0x0,(%rax)
mov    %r15,%rax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@DBL_MAX_10_EXP = global i32 0
define i8* @cvt(double %0, i32 %1, i32* nocapture %2, i32* nocapture writeonly %3, i8* returned %4, i32 %5) {
%7 = alloca double
%8 = alloca double
%9 = bitcast double* %7 to i8*
%10 = bitcast double* %8 to i8*
%11 = load i32, i32* @DBL_MAX_10_EXP
%12 = shl nsw i32 %11, 1
%13 = add nsw i32 %12, 9
%14 = icmp sgt i32 %13, %1
%15 = add nsw i32 %12, 8
%16 = select i1 %14, i32 %1, i32 %15
store i32 0, i32* %3
%17 = fcmp olt double %0, 0.000000e+00
br i1 %17, label %18, label %20
18: ; preds = %6
store i32 1, i32* %3
%19 = fneg double %0
br label %20
20: ; preds = %18, %6
%21 = phi double [ %19, %18 ], [ %0, %6 ]
%22 = call double @modf(double %21, double* %7)
%23 = load double, double* %7
%24 = fcmp une double %23, 0.000000e+00
br i1 %24, label %25, label %65
25: ; preds = %20
%26 = load i32, i32* @DBL_MAX_10_EXP
%27 = shl nsw i32 %26, 1
%28 = add nsw i32 %27, 10
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8, i8* %4, i64 %29
br label %38
31: ; preds = %38
%32 = load i32, i32* @DBL_MAX_10_EXP
%33 = shl nsw i32 %32, 1
%34 = add nsw i32 %33, 10
%35 = sext i32 %34 to i64
store double %43, double* %8
%36 = getelementptr inbounds i8, i8* %4, i64 %35
%37 = icmp ult i8* %49, %36
br i1 %37, label %53, label %74
38: ; preds = %25, %38
%39 = phi double [ %51, %38 ], [ %23, %25 ]
%40 = phi i8* [ %49, %38 ], [ %30, %25 ]
%41 = phi i32 [ %50, %38 ], [ 0, %25 ]
%42 = fdiv double %39, 1.000000e+01
%43 = call double @modf(double %42, double* %7)
%44 = fadd double %43, 3.000000e-02
%45 = fmul double %44, 1.000000e+01
%46 = fptosi double %45 to i32
%47 = trunc i32 %46 to i8
%48 = add i8 %47, 48
%49 = getelementptr inbounds i8, i8* %40, i64 -1
store i8 %48, i8* %49
%50 = add nuw nsw i32 %41, 1
%51 = load double, double* %7
%52 = fcmp une double %51, 0.000000e+00
br i1 %52, label %38, label %31
53: ; preds = %31, %53
%54 = phi i8* [ %56, %53 ], [ %49, %31 ]
%55 = phi i8* [ %58, %53 ], [ %4, %31 ]
%56 = getelementptr inbounds i8, i8* %54, i64 1
%57 = load i8, i8* %54
%58 = getelementptr inbounds i8, i8* %55, i64 1
store i8 %57, i8* %55
%59 = load i32, i32* @DBL_MAX_10_EXP
%60 = shl nsw i32 %59, 1
%61 = add nsw i32 %60, 10
%62 = sext i32 %61 to i64
%63 = getelementptr inbounds i8, i8* %4, i64 %62
%64 = icmp ult i8* %56, %63
br i1 %64, label %53, label %74
65: ; preds = %20
%66 = fcmp ogt double %22, 0.000000e+00
br i1 %66, label %67, label %74
67: ; preds = %65, %67
%68 = phi double [ %70, %67 ], [ %22, %65 ]
%69 = phi i32 [ %72, %67 ], [ 0, %65 ]
%70 = fmul double %68, 1.000000e+01
%71 = fcmp olt double %70, 1.000000e+00
%72 = add nsw i32 %69, -1
br i1 %71, label %67, label %73
73: ; preds = %67
store double %70, double* %8
br label %74
74: ; preds = %53, %31, %73, %65
%75 = phi double [ %22, %65 ], [ %68, %73 ], [ %22, %31 ], [ %22, %53 ]
%76 = phi i32 [ 0, %65 ], [ %69, %73 ], [ %50, %31 ], [ %50, %53 ]
%77 = phi i8* [ %4, %65 ], [ %4, %73 ], [ %4, %31 ], [ %58, %53 ]
%78 = sext i32 %16 to i64
%79 = getelementptr inbounds i8, i8* %4, i64 %78
%80 = icmp eq i32 %5, 0
%81 = select i1 %80, i32 %76, i32 0
%82 = sext i32 %81 to i64
%83 = getelementptr i8, i8* %79, i64 %82
store i32 %76, i32* %2
%84 = icmp ult i8* %83, %4
br i1 %84, label %144, label %85
85: ; preds = %74
%86 = icmp ugt i8* %77, %83
br i1 %86, label %105, label %87
87: ; preds = %85, %96
%88 = phi i8* [ %103, %96 ], [ %77, %85 ]
%89 = phi double [ %98, %96 ], [ %75, %85 ]
%90 = load i32, i32* @DBL_MAX_10_EXP
%91 = shl nsw i32 %90, 1
%92 = add nsw i32 %91, 10
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i8, i8* %4, i64 %93
%95 = icmp ult i8* %88, %94
br i1 %95, label %96, label %105
96: ; preds = %87
%97 = fmul double %89, 1.000000e+01
%98 = call double @modf(double %97, double* %8)
%99 = load double, double* %8
%100 = fptosi double %99 to i32
%101 = trunc i32 %100 to i8
%102 = add i8 %101, 48
%103 = getelementptr inbounds i8, i8* %88, i64 1
store i8 %102, i8* %88
%104 = icmp ugt i8* %103, %83
br i1 %104, label %105, label %87
105: ; preds = %87, %96, %85
%106 = load i32, i32* @DBL_MAX_10_EXP
%107 = shl nsw i32 %106, 1
%108 = add nsw i32 %107, 10
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds i8, i8* %4, i64 %109
%111 = icmp ult i8* %83, %110
br i1 %111, label %116, label %112
112: ; preds = %105
%113 = add nsw i32 %107, 9
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds i8, i8* %4, i64 %114
br label %144
116: ; preds = %105
%117 = load i8, i8* %83
%118 = add i8 %117, 5
store i8 %118, i8* %83
%119 = icmp sgt i8 %118, 57
br i1 %119, label %120, label %144
120: ; preds = %116, %139
%121 = phi i8* [ %142, %139 ], [ %83, %116 ]
%122 = phi i8* [ %141, %139 ], [ %83, %116 ]
store i8 48, i8* %121
%123 = icmp ugt i8* %121, %4
br i1 %123, label %124, label %128
124: ; preds = %120
%125 = getelementptr inbounds i8, i8* %121, i64 -1
%126 = load i8, i8* %125
%127 = add i8 %126, 1
store i8 %127, i8* %125
br label %139
128: ; preds = %120
store i8 49, i8* %121
%129 = load i32, i32* %2
%130 = add nsw i32 %129, 1
store i32 %130, i32* %2
br i1 %80, label %131, label %136
131: ; preds = %128
%132 = icmp ugt i8* %122, %4
br i1 %132, label %133, label %134
133: ; preds = %131
store i8 48, i8* %122
br label %134
134: ; preds = %133, %131
%135 = getelementptr inbounds i8, i8* %122, i64 1
br label %136
136: ; preds = %134, %128
%137 = phi i8* [ %122, %128 ], [ %135, %134 ]
%138 = load i8, i8* %121
br label %139
139: ; preds = %136, %124
%140 = phi i8 [ %138, %136 ], [ %127, %124 ]
%141 = phi i8* [ %137, %136 ], [ %122, %124 ]
%142 = phi i8* [ %121, %136 ], [ %125, %124 ]
%143 = icmp sgt i8 %140, 57
br i1 %143, label %120, label %144
144: ; preds = %139, %116, %74, %112
%145 = phi i8* [ %115, %112 ], [ %4, %74 ], [ %83, %116 ], [ %141, %139 ]
store i8 0, i8* %145
ret i8* %4
}