#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 */
float fabs(float);
float floor(float);
int calc_label_digits(float minp, float labels_ppm) {
  float a, b, c, d, e;
  int i, n, digits = 0;
  d = fabs(minp);
  e = 1.0 / labels_ppm;
  do {
    c = 1.0;
    for (i = 0; i < digits; i++)
      c *= 10;
    a = floor((c * d) + 0.0001);
    for (i = 1; i < 10; i++) {
      b = floor((c * (d + i * e)) + 0.0001);
      n = (int)floor(a - b);
      if (n == 0)
        break;
      a = b;
    }
    if (n == 0)
      digits++;
  } while (n == 0);
  return digits;
}


x86 assembly (clang, -O0):
<calc_label_digits>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movl   $0x0,-0x28(%rbp)
movss  -0x4(%rbp),%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x18(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xea7(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  0xea2(%rip),%xmm0
movss  %xmm0,-0x14(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    11a6 <calc_label_digits+0x86>
movss  0xe86(%rip),%xmm0
mulss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    117a <calc_label_digits+0x5a>
movss  -0x14(%rbp),%xmm0
mulss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe4c(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
call   1040 <floor@plt>
movss  %xmm0,-0xc(%rbp)
movl   $0x1,-0x20(%rbp)
cmpl   $0xa,-0x20(%rbp)
jge    125a <calc_label_digits+0x13a>
movss  -0x14(%rbp),%xmm0
movss  -0x18(%rbp),%xmm2
cvtsi2ssl -0x20(%rbp),%xmm1
movss  -0x1c(%rbp),%xmm3
mulss  %xmm3,%xmm1
addss  %xmm2,%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdfd(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
call   1040 <floor@plt>
movss  %xmm0,-0x10(%rbp)
movss  -0xc(%rbp),%xmm0
subss  -0x10(%rbp),%xmm0
call   1040 <floor@plt>
cvttss2si %xmm0,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jne    1242 <calc_label_digits+0x122>
jmp    125a <calc_label_digits+0x13a>
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11d5 <calc_label_digits+0xb5>
cmpl   $0x0,-0x24(%rbp)
jne    126d <calc_label_digits+0x14d>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1272 <calc_label_digits+0x152>
cmpl   $0x0,-0x24(%rbp)
je     1166 <calc_label_digits+0x46>
mov    -0x28(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<calc_label_digits>:
push   %rbx
sub    $0x60,%rsp
andps  0xee4(%rip),%xmm0
movss  0xefc(%rip),%xmm2
divss  %xmm1,%xmm2
movss  0xef4(%rip),%xmm1
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,0x30(%rsp)
movaps %xmm2,%xmm1
addss  %xmm0,%xmm1
movaps %xmm2,%xmm3
addss  %xmm2,%xmm3
addss  %xmm0,%xmm3
movss  %xmm3,0x4c(%rsp)
movss  0xeca(%rip),%xmm3
mulss  %xmm2,%xmm3
addss  %xmm0,%xmm3
movss  %xmm3,0x48(%rsp)
movss  0xeb8(%rip),%xmm3
mulss  %xmm2,%xmm3
addss  %xmm0,%xmm3
movss  %xmm3,0x44(%rsp)
movss  0xea6(%rip),%xmm3
mulss  %xmm2,%xmm3
addss  %xmm0,%xmm3
movss  %xmm3,0x40(%rsp)
movss  0xe94(%rip),%xmm3
mulss  %xmm2,%xmm3
addss  %xmm0,%xmm3
movss  %xmm3,0x3c(%rsp)
movss  0xe82(%rip),%xmm3
mulss  %xmm2,%xmm3
addss  %xmm0,%xmm3
movss  %xmm3,0x38(%rsp)
mulss  0xe70(%rip),%xmm2
addss  %xmm0,%xmm2
movss  %xmm2,0x34(%rsp)
unpcklps %xmm1,%xmm0
movaps %xmm0,0x50(%rsp)
xor    %ebx,%ebx
jmp    11f3 <calc_label_digits+0xe3>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%ebx
movss  0xe45(%rip),%xmm1
movss  0xe1d(%rip),%xmm0
test   %ebx,%ebx
je     1269 <calc_label_digits+0x159>
lea    -0x1(%rbx),%eax
movss  0xe0e(%rip),%xmm0
cmp    $0x7,%eax
jb     1255 <calc_label_digits+0x145>
mov    %ebx,%eax
and    $0xfffffff8,%eax
movss  0xdfc(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
mulss  %xmm1,%xmm0
add    $0xfffffff8,%eax
jne    1230 <calc_label_digits+0x120>
test   $0x7,%bl
je     1269 <calc_label_digits+0x159>
mov    %ebx,%eax
and    $0x7,%eax
nop
mulss  %xmm1,%xmm0
add    $0xffffffff,%eax
jne    1260 <calc_label_digits+0x150>
movaps %xmm0,0x20(%rsp)
shufps $0x0,%xmm0,%xmm0
mulps  0x50(%rsp),%xmm0
cvtps2pd %xmm0,%xmm0
addpd  0xd8e(%rip),%xmm0
cvtpd2ps %xmm0,%xmm0
movapd %xmm0,0x10(%rsp)
shufps $0x55,%xmm0,%xmm0
call   1030 <floorf@plt>
movss  %xmm0,0xc(%rsp)
movaps 0x10(%rsp),%xmm0
call   1030 <floorf@plt>
subss  0xc(%rsp),%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
movaps 0x20(%rsp),%xmm0
mulss  0x4c(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xd75(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
call   1030 <floorf@plt>
movaps %xmm0,%xmm1
movss  0xc(%rsp),%xmm0
movss  %xmm1,0x10(%rsp)
subss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
movaps 0x20(%rsp),%xmm0
mulss  0x48(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xd31(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
call   1030 <floorf@plt>
movaps %xmm0,%xmm1
movss  0x10(%rsp),%xmm0
movss  %xmm1,0xc(%rsp)
subss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
movaps 0x20(%rsp),%xmm0
mulss  0x44(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xced(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
call   1030 <floorf@plt>
movaps %xmm0,%xmm1
movss  0xc(%rsp),%xmm0
movss  %xmm1,0x10(%rsp)
subss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
movaps 0x20(%rsp),%xmm0
mulss  0x40(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xca9(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
call   1030 <floorf@plt>
movaps %xmm0,%xmm1
movss  0x10(%rsp),%xmm0
movss  %xmm1,0xc(%rsp)
subss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
movaps 0x20(%rsp),%xmm0
mulss  0x3c(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xc65(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
call   1030 <floorf@plt>
movaps %xmm0,%xmm1
movss  0xc(%rsp),%xmm0
movss  %xmm1,0x10(%rsp)
subss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
movaps 0x20(%rsp),%xmm0
mulss  0x38(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xc21(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
call   1030 <floorf@plt>
movaps %xmm0,%xmm1
movss  0x10(%rsp),%xmm0
movss  %xmm1,0xc(%rsp)
subss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
movaps 0x20(%rsp),%xmm0
mulss  0x34(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xbdd(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
call   1030 <floorf@plt>
movaps %xmm0,%xmm1
movss  0xc(%rsp),%xmm0
movss  %xmm1,0x10(%rsp)
subss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
movaps 0x20(%rsp),%xmm0
mulss  0x30(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xb99(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
call   1030 <floorf@plt>
movss  0x10(%rsp),%xmm1
subss  %xmm0,%xmm1
movaps %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
test   %eax,%eax
je     11f0 <calc_label_digits+0xe0>
mov    %ebx,%eax
add    $0x60,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define i32 @calc_label_digits(float %0, float %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store float %0, float* %3
store float %1, float* %4
store i32 0, i32* %12
%13 = load float, float* %3
%14 = call float @fabs(float %13)
store float %14, float* %8
%15 = load float, float* %4
%16 = fpext float %15 to double
%17 = fdiv double 1.000000e+00, %16
%18 = fptrunc double %17 to float
store float %18, float* %9
br label %19
19: ; preds = %73, %2
store float 1.000000e+00, float* %7
store i32 0, i32* %10
br label %20
20: ; preds = %27, %19
%21 = load i32, i32* %10
%22 = load i32, i32* %12
%23 = icmp slt i32 %21, %22
br i1 %23, label %24, label %30
24: ; preds = %20
%25 = load float, float* %7
%26 = fmul float %25, 1.000000e+01
store float %26, float* %7
br label %27
27: ; preds = %24
%28 = load i32, i32* %10
%29 = add nsw i32 %28, 1
store i32 %29, i32* %10
br label %20
30: ; preds = %20
%31 = load float, float* %7
%32 = load float, float* %8
%33 = fmul float %31, %32
%34 = fpext float %33 to double
%35 = fadd double %34, 1.000000e-04
%36 = fptrunc double %35 to float
%37 = call float @floor(float %36)
store float %37, float* %5
store i32 1, i32* %10
br label %38
38: ; preds = %63, %30
%39 = load i32, i32* %10
%40 = icmp slt i32 %39, 10
br i1 %40, label %41, label %66
41: ; preds = %38
%42 = load float, float* %7
%43 = load float, float* %8
%44 = load i32, i32* %10
%45 = sitofp i32 %44 to float
%46 = load float, float* %9
%47 = call float @llvm.fmuladd.f32(float %45, float %46, float %43)
%48 = fmul float %42, %47
%49 = fpext float %48 to double
%50 = fadd double %49, 1.000000e-04
%51 = fptrunc double %50 to float
%52 = call float @floor(float %51)
store float %52, float* %6
%53 = load float, float* %5
%54 = load float, float* %6
%55 = fsub float %53, %54
%56 = call float @floor(float %55)
%57 = fptosi float %56 to i32
store i32 %57, i32* %11
%58 = load i32, i32* %11
%59 = icmp eq i32 %58, 0
br i1 %59, label %60, label %61
60: ; preds = %41
br label %66
61: ; preds = %41
%62 = load float, float* %6
store float %62, float* %5
br label %63
63: ; preds = %61
%64 = load i32, i32* %10
%65 = add nsw i32 %64, 1
store i32 %65, i32* %10
br label %38
66: ; preds = %60, %38
%67 = load i32, i32* %11
%68 = icmp eq i32 %67, 0
br i1 %68, label %69, label %72
69: ; preds = %66
%70 = load i32, i32* %12
%71 = add nsw i32 %70, 1
store i32 %71, i32* %12
br label %72
72: ; preds = %69, %66
br label %73
73: ; preds = %72
%74 = load i32, i32* %11
%75 = icmp eq i32 %74, 0
br i1 %75, label %19, label %76
76: ; preds = %73
%77 = load i32, i32* %12
ret i32 %77
}

LLVM IR (-O2):
define i32 @calc_label_digits(float %0, float %1) {
%3 = tail call float @llvm.fabs.f32(float %0)
%4 = fdiv float 1.000000e+00, %1
%5 = tail call float @llvm.fmuladd.f32(float %4, float 9.000000e+00, float %3)
%6 = fadd float %4, %3
%7 = tail call float @llvm.fmuladd.f32(float %4, float 2.000000e+00, float %3)
%8 = tail call float @llvm.fmuladd.f32(float %4, float 3.000000e+00, float %3)
%9 = tail call float @llvm.fmuladd.f32(float %4, float 4.000000e+00, float %3)
%10 = tail call float @llvm.fmuladd.f32(float %4, float 5.000000e+00, float %3)
%11 = tail call float @llvm.fmuladd.f32(float %4, float 6.000000e+00, float %3)
%12 = tail call float @llvm.fmuladd.f32(float %4, float 7.000000e+00, float %3)
%13 = tail call float @llvm.fmuladd.f32(float %4, float 8.000000e+00, float %3)
%14 = insertelement <2 x float> poison, float %3, i64 0
%15 = insertelement <2 x float> %14, float %6, i64 1
br label %16
16: ; preds = %143, %2
%17 = phi i32 [ 0, %2 ], [ %144, %143 ]
%18 = icmp eq i32 %17, 0
br i1 %18, label %48, label %19
19: ; preds = %16
%20 = add nsw i32 %17, -1
%21 = and i32 %17, 7
%22 = icmp ult i32 %20, 7
br i1 %22, label %38, label %23
23: ; preds = %19
%24 = and i32 %17, 2147483640
br label %25
25: ; preds = %25, %23
%26 = phi float [ 1.000000e+00, %23 ], [ %35, %25 ]
%27 = phi i32 [ 0, %23 ], [ %36, %25 ]
%28 = fmul float %26, 1.000000e+01
%29 = fmul float %28, 1.000000e+01
%30 = fmul float %29, 1.000000e+01
%31 = fmul float %30, 1.000000e+01
%32 = fmul float %31, 1.000000e+01
%33 = fmul float %32, 1.000000e+01
%34 = fmul float %33, 1.000000e+01
%35 = fmul float %34, 1.000000e+01
%36 = add i32 %27, 8
%37 = icmp eq i32 %36, %24
br i1 %37, label %38, label %25
38: ; preds = %25, %19
%39 = phi float [ undef, %19 ], [ %35, %25 ]
%40 = phi float [ 1.000000e+00, %19 ], [ %35, %25 ]
%41 = icmp eq i32 %21, 0
br i1 %41, label %48, label %42
42: ; preds = %38, %42
%43 = phi float [ %45, %42 ], [ %40, %38 ]
%44 = phi i32 [ %46, %42 ], [ 0, %38 ]
%45 = fmul float %43, 1.000000e+01
%46 = add i32 %44, 1
%47 = icmp eq i32 %46, %21
br i1 %47, label %48, label %42
48: ; preds = %38, %42, %16
%49 = phi float [ 1.000000e+00, %16 ], [ %39, %38 ], [ %45, %42 ]
%50 = insertelement <2 x float> poison, float %49, i64 0
%51 = shufflevector <2 x float> %50, <2 x float> poison, <2 x i32> zeroinitializer
%52 = fmul <2 x float> %15, %51
%53 = fpext <2 x float> %52 to <2 x double>
%54 = fadd <2 x double> %53, <double 1.000000e-04, double 1.000000e-04>
%55 = fptrunc <2 x double> %54 to <2 x float>
%56 = call <2 x float> @llvm.floor.v2f32(<2 x float> %55)
%57 = extractelement <2 x float> %56, i64 0
%58 = extractelement <2 x float> %56, i64 1
%59 = fsub float %57, %58
%60 = tail call float @llvm.floor.f32(float %59)
%61 = fptosi float %60 to i32
%62 = icmp eq i32 %61, 0
br i1 %62, label %143, label %63
63: ; preds = %48
%64 = fmul float %49, %7
%65 = fpext float %64 to double
%66 = fadd double %65, 1.000000e-04
%67 = fptrunc double %66 to float
%68 = tail call float @llvm.floor.f32(float %67)
%69 = fsub float %58, %68
%70 = tail call float @llvm.floor.f32(float %69)
%71 = fptosi float %70 to i32
%72 = icmp eq i32 %71, 0
br i1 %72, label %143, label %73
73: ; preds = %63
%74 = fmul float %49, %8
%75 = fpext float %74 to double
%76 = fadd double %75, 1.000000e-04
%77 = fptrunc double %76 to float
%78 = tail call float @llvm.floor.f32(float %77)
%79 = fsub float %68, %78
%80 = tail call float @llvm.floor.f32(float %79)
%81 = fptosi float %80 to i32
%82 = icmp eq i32 %81, 0
br i1 %82, label %143, label %83
83: ; preds = %73
%84 = fmul float %49, %9
%85 = fpext float %84 to double
%86 = fadd double %85, 1.000000e-04
%87 = fptrunc double %86 to float
%88 = tail call float @llvm.floor.f32(float %87)
%89 = fsub float %78, %88
%90 = tail call float @llvm.floor.f32(float %89)
%91 = fptosi float %90 to i32
%92 = icmp eq i32 %91, 0
br i1 %92, label %143, label %93
93: ; preds = %83
%94 = fmul float %49, %10
%95 = fpext float %94 to double
%96 = fadd double %95, 1.000000e-04
%97 = fptrunc double %96 to float
%98 = tail call float @llvm.floor.f32(float %97)
%99 = fsub float %88, %98
%100 = tail call float @llvm.floor.f32(float %99)
%101 = fptosi float %100 to i32
%102 = icmp eq i32 %101, 0
br i1 %102, label %143, label %103
103: ; preds = %93
%104 = fmul float %49, %11
%105 = fpext float %104 to double
%106 = fadd double %105, 1.000000e-04
%107 = fptrunc double %106 to float
%108 = tail call float @llvm.floor.f32(float %107)
%109 = fsub float %98, %108
%110 = tail call float @llvm.floor.f32(float %109)
%111 = fptosi float %110 to i32
%112 = icmp eq i32 %111, 0
br i1 %112, label %143, label %113
113: ; preds = %103
%114 = fmul float %49, %12
%115 = fpext float %114 to double
%116 = fadd double %115, 1.000000e-04
%117 = fptrunc double %116 to float
%118 = tail call float @llvm.floor.f32(float %117)
%119 = fsub float %108, %118
%120 = tail call float @llvm.floor.f32(float %119)
%121 = fptosi float %120 to i32
%122 = icmp eq i32 %121, 0
br i1 %122, label %143, label %123
123: ; preds = %113
%124 = fmul float %49, %13
%125 = fpext float %124 to double
%126 = fadd double %125, 1.000000e-04
%127 = fptrunc double %126 to float
%128 = tail call float @llvm.floor.f32(float %127)
%129 = fsub float %118, %128
%130 = tail call float @llvm.floor.f32(float %129)
%131 = fptosi float %130 to i32
%132 = icmp eq i32 %131, 0
br i1 %132, label %143, label %133
133: ; preds = %123
%134 = fmul float %49, %5
%135 = fpext float %134 to double
%136 = fadd double %135, 1.000000e-04
%137 = fptrunc double %136 to float
%138 = tail call float @llvm.floor.f32(float %137)
%139 = fsub float %128, %138
%140 = tail call float @llvm.floor.f32(float %139)
%141 = fptosi float %140 to i32
%142 = icmp eq i32 %141, 0
br i1 %142, label %143, label %145
143: ; preds = %133, %123, %113, %103, %93, %83, %73, %63, %48
%144 = add nuw nsw i32 %17, 1
br label %16
145: ; preds = %133
ret i32 %17
}