#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 */
double exp(double);
double log(double);
int /*<<< orphan*/ printf(char *);
double convert(double x) {
  int k;
  double fact, prev, sum, term;
  if (x <= 0.0)
    printf("Bad argument in convert\n");
  if (x < 5.0e-308)
    return log(x) + 0.5772156649;
  if (x <= -log(5.0e-16)) {
    sum = 0.0;
    fact = 1.0;
    for (k = 1; k <= 100; k++) {
      fact *= x / k;
      term = fact / k;
      sum += term;
      if (term < 5.0e-16 * sum)
        break;
    }
    if (k > 100)
      printf("series failed in convert\n");
    return sum + log(x) + 0.5772156649;
  } else {
    sum = 0.0;
    term = 1.0;
    for (k = 1; k <= 100; k++) {
      prev = term;
      term *= k / x;
      if (term < 5.0e-16)
        break;
      if (term < prev)
        sum += term;
      else {
        sum -= prev;
        break;
      }
    }
    return exp(x) * (1.0 + sum) / x;
  }
}


x86 assembly (clang, -O0):
<convert>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movsd  %xmm0,-0x10(%rbp)
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jb     1157 <convert+0x27>
lea    0xece(%rip),%rdi
call   1030 <printf@plt>
movsd  0xea1(%rip),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    118a <convert+0x5a>
movsd  -0x10(%rbp),%xmm0
call   1050 <log@plt>
movsd  0xe9c(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    137b <convert+0x24b>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  0xe6c(%rip),%xmm0
call   1050 <log@plt>
movsd  -0x40(%rbp),%xmm1
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
ucomisd %xmm1,%xmm0
jb     12a7 <convert+0x177>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xe39(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jg     125b <convert+0x12b>
movsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  0xdd4(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1248 <convert+0x118>
jmp    125b <convert+0x12b>
jmp    124d <convert+0x11d>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11e3 <convert+0xb3>
cmpl   $0x64,-0x14(%rbp)
jle    1271 <convert+0x141>
lea    0xdcd(%rip),%rdi
call   1030 <printf@plt>
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x10(%rbp),%xmm0
call   1050 <log@plt>
movaps %xmm0,%xmm1
movsd  -0x48(%rbp),%xmm0
addsd  %xmm1,%xmm0
movsd  0xd7f(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    137b <convert+0x24b>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  0xd59(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x1,-0x14(%rbp)
cmpl   $0x64,-0x14(%rbp)
jg     1356 <convert+0x226>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
cvtsi2sdl -0x14(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  0xd15(%rip),%xmm0
ucomisd -0x38(%rbp),%xmm0
jbe    1303 <convert+0x1d3>
jmp    1356 <convert+0x226>
movsd  -0x38(%rbp),%xmm1
movsd  -0x28(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    132b <convert+0x1fb>
movsd  -0x38(%rbp),%xmm0
addsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1343 <convert+0x213>
movsd  -0x28(%rbp),%xmm1
movsd  -0x30(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1356 <convert+0x226>
jmp    1348 <convert+0x218>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    12c3 <convert+0x193>
movsd  -0x10(%rbp),%xmm0
call   1040 <exp@plt>
movsd  0xca8(%rip),%xmm1
addsd  -0x30(%rbp),%xmm1
mulsd  %xmm1,%xmm0
divsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<convert>:
sub    $0x18,%rsp
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jb     1156 <convert+0x26>
lea    0xefc(%rip),%rdi
movsd  %xmm0,0x10(%rsp)
call   1030 <puts@plt>
movsd  0x10(%rsp),%xmm0
movsd  0xea2(%rip),%xmm1
ucomisd %xmm0,%xmm1
jbe    117a <convert+0x4a>
call   1050 <log@plt>
movapd %xmm0,%xmm1
addsd  0xeab(%rip),%xmm1
jmp    12dd <convert+0x1ad>
movsd  0xe86(%rip),%xmm1
mov    $0x1,%eax
ucomisd %xmm0,%xmm1
jae    120e <convert+0xde>
xorpd  %xmm4,%xmm4
movsd  0xe73(%rip),%xmm3
movsd  0xe73(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
divsd  %xmm0,%xmm2
mulsd  %xmm3,%xmm2
ucomisd %xmm2,%xmm1
ja     12b4 <convert+0x184>
ucomisd %xmm2,%xmm3
jbe    12b0 <convert+0x180>
addsd  %xmm2,%xmm4
add    $0x1,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
divsd  %xmm0,%xmm3
mulsd  %xmm2,%xmm3
ucomisd %xmm3,%xmm1
ja     12b4 <convert+0x184>
ucomisd %xmm3,%xmm2
jbe    12ac <convert+0x17c>
addsd  %xmm3,%xmm4
add    $0x1,%eax
cmp    $0x65,%eax
jne    11b0 <convert+0x80>
jmp    12b4 <convert+0x184>
movsd  0xdfa(%rip),%xmm4
xorpd  %xmm5,%xmm5
movsd  0xdf6(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
movapd %xmm4,%xmm3
movapd %xmm0,%xmm4
divsd  %xmm2,%xmm4
mulsd  %xmm3,%xmm4
movapd %xmm4,%xmm3
divsd  %xmm2,%xmm3
addsd  %xmm3,%xmm5
movapd %xmm5,%xmm2
mulsd  %xmm1,%xmm2
ucomisd %xmm3,%xmm2
ja     128d <convert+0x15d>
add    $0x1,%eax
cmp    $0x65,%eax
jne    1230 <convert+0x100>
lea    0xdb8(%rip),%rdi
movsd  %xmm0,0x10(%rsp)
movsd  %xmm5,0x8(%rsp)
call   1030 <puts@plt>
movsd  0x8(%rsp),%xmm5
movsd  0x10(%rsp),%xmm0
movsd  %xmm5,0x8(%rsp)
call   1050 <log@plt>
movsd  0x8(%rsp),%xmm1
addsd  %xmm0,%xmm1
addsd  0xd76(%rip),%xmm1
jmp    12dd <convert+0x1ad>
movapd %xmm2,%xmm3
subsd  %xmm3,%xmm4
movsd  %xmm4,0x8(%rsp)
movsd  %xmm0,0x10(%rsp)
call   1040 <exp@plt>
movsd  0x8(%rsp),%xmm1
addsd  0xd3d(%rip),%xmm1
mulsd  %xmm0,%xmm1
divsd  0x10(%rsp),%xmm1
movapd %xmm1,%xmm0
add    $0x18,%rsp
ret

LLVM IR (-O0):
@.str = [25 x i8] c"Bad argument in convert\0A\00"
@.str.1 = [26 x i8] c"series failed in convert\0A\00"
define double @convert(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca i32
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
store double %0, double* %3
%9 = load double, double* %3
%10 = fcmp ole double %9, 0.000000e+00
br i1 %10, label %11, label %13
11: ; preds = %1
%12 = call i32 @printf(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str, i64 0, i64 0))
br label %13
13: ; preds = %11, %1
%14 = load double, double* %3
%15 = fcmp olt double %14, 5.000000e-308
br i1 %15, label %16, label %20
16: ; preds = %13
%17 = load double, double* %3
%18 = call double @log(double %17)
%19 = fadd double %18, 0x3FE2788CFC6F802A
store double %19, double* %2
br label %102
20: ; preds = %13
%21 = load double, double* %3
%22 = call double @log(double 5.000000e-16)
%23 = fneg double %22
%24 = fcmp ole double %21, %23
br i1 %24, label %25, label %63
25: ; preds = %20
store double 0.000000e+00, double* %7
store double 1.000000e+00, double* %5
store i32 1, i32* %4
br label %26
26: ; preds = %49, %25
%27 = load i32, i32* %4
%28 = icmp sle i32 %27, 100
br i1 %28, label %29, label %52
29: ; preds = %26
%30 = load double, double* %3
%31 = load i32, i32* %4
%32 = sitofp i32 %31 to double
%33 = fdiv double %30, %32
%34 = load double, double* %5
%35 = fmul double %34, %33
store double %35, double* %5
%36 = load double, double* %5
%37 = load i32, i32* %4
%38 = sitofp i32 %37 to double
%39 = fdiv double %36, %38
store double %39, double* %8
%40 = load double, double* %8
%41 = load double, double* %7
%42 = fadd double %41, %40
store double %42, double* %7
%43 = load double, double* %8
%44 = load double, double* %7
%45 = fmul double 5.000000e-16, %44
%46 = fcmp olt double %43, %45
br i1 %46, label %47, label %48
47: ; preds = %29
br label %52
48: ; preds = %29
br label %49
49: ; preds = %48
%50 = load i32, i32* %4
%51 = add nsw i32 %50, 1
store i32 %51, i32* %4
br label %26
52: ; preds = %47, %26
%53 = load i32, i32* %4
%54 = icmp sgt i32 %53, 100
br i1 %54, label %55, label %57
55: ; preds = %52
%56 = call i32 @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.1, i64 0, i64 0))
br label %57
57: ; preds = %55, %52
%58 = load double, double* %7
%59 = load double, double* %3
%60 = call double @log(double %59)
%61 = fadd double %58, %60
%62 = fadd double %61, 0x3FE2788CFC6F802A
store double %62, double* %2
br label %102
63: ; preds = %20
store double 0.000000e+00, double* %7
store double 1.000000e+00, double* %8
store i32 1, i32* %4
br label %64
64: ; preds = %91, %63
%65 = load i32, i32* %4
%66 = icmp sle i32 %65, 100
br i1 %66, label %67, label %94
67: ; preds = %64
%68 = load double, double* %8
store double %68, double* %6
%69 = load i32, i32* %4
%70 = sitofp i32 %69 to double
%71 = load double, double* %3
%72 = fdiv double %70, %71
%73 = load double, double* %8
%74 = fmul double %73, %72
store double %74, double* %8
%75 = load double, double* %8
%76 = fcmp olt double %75, 5.000000e-16
br i1 %76, label %77, label %78
77: ; preds = %67
br label %94
78: ; preds = %67
%79 = load double, double* %8
%80 = load double, double* %6
%81 = fcmp olt double %79, %80
br i1 %81, label %82, label %86
82: ; preds = %78
%83 = load double, double* %8
%84 = load double, double* %7
%85 = fadd double %84, %83
store double %85, double* %7
br label %90
86: ; preds = %78
%87 = load double, double* %6
%88 = load double, double* %7
%89 = fsub double %88, %87
store double %89, double* %7
br label %94
90: ; preds = %82
br label %91
91: ; preds = %90
%92 = load i32, i32* %4
%93 = add nsw i32 %92, 1
store i32 %93, i32* %4
br label %64
94: ; preds = %86, %77, %64
%95 = load double, double* %3
%96 = call double @exp(double %95)
%97 = load double, double* %7
%98 = fadd double 1.000000e+00, %97
%99 = fmul double %96, %98
%100 = load double, double* %3
%101 = fdiv double %99, %100
store double %101, double* %2
br label %102
102: ; preds = %94, %57, %16
%103 = load double, double* %2
ret double %103
}

LLVM IR (-O2):
@str = [25 x i8] c"series failed in convert\00"
@str.2 = [24 x i8] c"Bad argument in convert\00"
define double @convert(double %0) {
%2 = fcmp ugt double %0, 0.000000e+00
br i1 %2, label %5, label %3
3: ; preds = %1
%4 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([24 x i8], [24 x i8]* @str.2, i64 0, i64 0))
br label %5
5: ; preds = %3, %1
%6 = fcmp olt double %0, 5.000000e-308
br i1 %6, label %7, label %10
7: ; preds = %5
%8 = tail call double @log(double %0)
%9 = fadd double %8, 0x3FE2788CFC6F802A
br label %65
10: ; preds = %5
%11 = fcmp ugt double %0, 0x40419DAFABF5E8AC
br i1 %11, label %32, label %15
12: ; preds = %15
%13 = add nuw nsw i32 %18, 1
%14 = icmp eq i32 %13, 101
br i1 %14, label %26, label %15
15: ; preds = %10, %12
%16 = phi double [ %23, %12 ], [ 0.000000e+00, %10 ]
%17 = phi double [ %21, %12 ], [ 1.000000e+00, %10 ]
%18 = phi i32 [ %13, %12 ], [ 1, %10 ]
%19 = sitofp i32 %18 to double
%20 = fdiv double %0, %19
%21 = fmul double %17, %20
%22 = fdiv double %21, %19
%23 = fadd double %16, %22
%24 = fmul double %23, 5.000000e-16
%25 = fcmp olt double %22, %24
br i1 %25, label %28, label %12
26: ; preds = %12
%27 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([25 x i8], [25 x i8]* @str, i64 0, i64 0))
br label %28
28: ; preds = %15, %26
%29 = tail call double @log(double %0)
%30 = fadd double %23, %29
%31 = fadd double %30, 0x3FE2788CFC6F802A
br label %65
32: ; preds = %10, %51
%33 = phi double [ %47, %51 ], [ 1.000000e+00, %10 ]
%34 = phi double [ %52, %51 ], [ 0.000000e+00, %10 ]
%35 = phi i32 [ %53, %51 ], [ 1, %10 ]
%36 = sitofp i32 %35 to double
%37 = fdiv double %36, %0
%38 = fmul double %33, %37
%39 = fcmp olt double %38, 5.000000e-16
br i1 %39, label %59, label %40
40: ; preds = %32
%41 = fcmp olt double %38, %33
br i1 %41, label %42, label %55
42: ; preds = %40
%43 = fadd double %34, %38
%44 = add nuw nsw i32 %35, 1
%45 = sitofp i32 %44 to double
%46 = fdiv double %45, %0
%47 = fmul double %38, %46
%48 = fcmp olt double %47, 5.000000e-16
br i1 %48, label %59, label %49
49: ; preds = %42
%50 = fcmp olt double %47, %38
br i1 %50, label %51, label %55
51: ; preds = %49
%52 = fadd double %43, %47
%53 = add nuw nsw i32 %35, 2
%54 = icmp eq i32 %53, 101
br i1 %54, label %59, label %32
55: ; preds = %49, %40
%56 = phi double [ %33, %40 ], [ %38, %49 ]
%57 = phi double [ %34, %40 ], [ %43, %49 ]
%58 = fsub double %57, %56
br label %59
59: ; preds = %32, %42, %51, %55
%60 = phi double [ %58, %55 ], [ %34, %32 ], [ %43, %42 ], [ %52, %51 ]
%61 = tail call double @exp(double %0)
%62 = fadd double %60, 1.000000e+00
%63 = fmul double %61, %62
%64 = fdiv double %63, %0
br label %65
65: ; preds = %59, %28, %7
%66 = phi double [ %9, %7 ], [ %31, %28 ], [ %64, %59 ]
ret double %66
}