#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);
int GetDigits(float number) {
  number = fabs(number);
  if (number >= 1000000000000000000) {
    return 19;
  } else if (number >= 100000000000000000) {
    return 18;
  } else if (number >= 10000000000000000) {
    return 17;
  } else if (number >= 1000000000000000) {
    return 16;
  } else if (number >= 100000000000000) {
    return 15;
  } else if (number >= 10000000000000) {
    return 14;
  } else if (number >= 1000000000000) {
    return 13;
  } else if (number >= 100000000000) {
    return 12;
  } else if (number >= 10000000000) {
    return 11;
  } else if (number >= 1000000000) {
    return 10;
  } else if (number >= 100000000) {
    return 9;
  } else if (number >= 10000000) {
    return 8;
  } else if (number >= 1000000) {
    return 7;
  } else if (number >= 100000) {
    return 6;
  } else if (number >= 10000) {
    return 5;
  } else if (number >= 1000) {
    return 4;
  } else if (number >= 100) {
    return 3;
  } else if (number >= 10) {
    return 2;
  } else if (number >= 1) {
    return 1;
  }
  return 0;
}


x86 assembly (clang, -O0):
<GetDigits>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
call   1030 <fabs@plt>
movss  %xmm0,-0x8(%rbp)
movss  -0x8(%rbp),%xmm0
movss  0xec7(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     114e <GetDigits+0x3e>
movl   $0x13,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xea9(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     1170 <GetDigits+0x60>
movl   $0x12,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xe8b(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     1192 <GetDigits+0x82>
movl   $0x11,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xe6d(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     11b4 <GetDigits+0xa4>
movl   $0x10,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xe4f(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     11d6 <GetDigits+0xc6>
movl   $0xf,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xe31(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     11f8 <GetDigits+0xe8>
movl   $0xe,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xe13(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     121a <GetDigits+0x10a>
movl   $0xd,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xdf5(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     123c <GetDigits+0x12c>
movl   $0xc,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xdd7(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     125e <GetDigits+0x14e>
movl   $0xb,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xdb9(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     1280 <GetDigits+0x170>
movl   $0xa,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xd9b(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     12a2 <GetDigits+0x192>
movl   $0x9,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xd7d(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     12c4 <GetDigits+0x1b4>
movl   $0x8,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xd5f(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     12e6 <GetDigits+0x1d6>
movl   $0x7,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xd41(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     1308 <GetDigits+0x1f8>
movl   $0x6,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xd23(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     132a <GetDigits+0x21a>
movl   $0x5,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xd05(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     134c <GetDigits+0x23c>
movl   $0x4,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xce7(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     136e <GetDigits+0x25e>
movl   $0x3,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xcc9(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     1390 <GetDigits+0x280>
movl   $0x2,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
movss  -0x8(%rbp),%xmm0
movss  0xcab(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     13b2 <GetDigits+0x2a2>
movl   $0x1,-0x4(%rbp)
jmp    1413 <GetDigits+0x303>
jmp    13b7 <GetDigits+0x2a7>
jmp    13bc <GetDigits+0x2ac>
jmp    13c1 <GetDigits+0x2b1>
jmp    13c6 <GetDigits+0x2b6>
jmp    13cb <GetDigits+0x2bb>
jmp    13d0 <GetDigits+0x2c0>
jmp    13d5 <GetDigits+0x2c5>
jmp    13da <GetDigits+0x2ca>
jmp    13df <GetDigits+0x2cf>
jmp    13e4 <GetDigits+0x2d4>
jmp    13e9 <GetDigits+0x2d9>
jmp    13ee <GetDigits+0x2de>
jmp    13f3 <GetDigits+0x2e3>
jmp    13f8 <GetDigits+0x2e8>
jmp    13fd <GetDigits+0x2ed>
jmp    1402 <GetDigits+0x2f2>
jmp    1407 <GetDigits+0x2f7>
jmp    140c <GetDigits+0x2fc>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<GetDigits>:
andps  0xef9(%rip),%xmm0
mov    $0x13,%eax
ucomiss 0xefd(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x12,%eax
ucomiss 0xeef(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x11,%eax
ucomiss 0xee1(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x10,%eax
ucomiss 0xed3(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0xf,%eax
ucomiss 0xec5(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0xe,%eax
ucomiss 0xeb7(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0xd,%eax
ucomiss 0xea9(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0xc,%eax
ucomiss 0xe9b(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0xb,%eax
ucomiss 0xe8d(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0xa,%eax
ucomiss 0xe7f(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x9,%eax
ucomiss 0xe75(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x8,%eax
ucomiss 0xe6b(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x7,%eax
ucomiss 0xe61(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x6,%eax
ucomiss 0xe57(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x5,%eax
ucomiss 0xe4d(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x4,%eax
ucomiss 0xe43(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x3,%eax
ucomiss 0xe39(%rip),%xmm0
jae    1233 <GetDigits+0x133>
mov    $0x2,%eax
ucomiss 0xe2f(%rip),%xmm0
jae    1233 <GetDigits+0x133>
xor    %eax,%eax
ucomiss 0xe28(%rip),%xmm0
setae  %al
ret

LLVM IR (-O0):
define i32 @GetDigits(float %0) {
%2 = alloca i32
%3 = alloca float
store float %0, float* %3
%4 = load float, float* %3
%5 = call float @fabs(float %4)
store float %5, float* %3
%6 = load float, float* %3
%7 = fcmp oge float %6, 0x43ABC16D60000000
br i1 %7, label %8, label %9
8: ; preds = %1
store i32 19, i32* %2
br label %100
9: ; preds = %1
%10 = load float, float* %3
%11 = fcmp oge float %10, 0x4376345780000000
br i1 %11, label %12, label %13
12: ; preds = %9
store i32 18, i32* %2
br label %100
13: ; preds = %9
%14 = load float, float* %3
%15 = fcmp oge float %14, 0x4341C37940000000
br i1 %15, label %16, label %17
16: ; preds = %13
store i32 17, i32* %2
br label %100
17: ; preds = %13
%18 = load float, float* %3
%19 = fcmp oge float %18, 0x430C6BF520000000
br i1 %19, label %20, label %21
20: ; preds = %17
store i32 16, i32* %2
br label %100
21: ; preds = %17
%22 = load float, float* %3
%23 = fcmp oge float %22, 0x42D6BCC420000000
br i1 %23, label %24, label %25
24: ; preds = %21
store i32 15, i32* %2
br label %100
25: ; preds = %21
%26 = load float, float* %3
%27 = fcmp oge float %26, 0x42A2309CE0000000
br i1 %27, label %28, label %29
28: ; preds = %25
store i32 14, i32* %2
br label %100
29: ; preds = %25
%30 = load float, float* %3
%31 = fcmp oge float %30, 0x426D1A94A0000000
br i1 %31, label %32, label %33
32: ; preds = %29
store i32 13, i32* %2
br label %100
33: ; preds = %29
%34 = load float, float* %3
%35 = fcmp oge float %34, 0x42374876E0000000
br i1 %35, label %36, label %37
36: ; preds = %33
store i32 12, i32* %2
br label %100
37: ; preds = %33
%38 = load float, float* %3
%39 = fcmp oge float %38, 1.000000e+10
br i1 %39, label %40, label %41
40: ; preds = %37
store i32 11, i32* %2
br label %100
41: ; preds = %37
%42 = load float, float* %3
%43 = fcmp oge float %42, 1.000000e+09
br i1 %43, label %44, label %45
44: ; preds = %41
store i32 10, i32* %2
br label %100
45: ; preds = %41
%46 = load float, float* %3
%47 = fcmp oge float %46, 1.000000e+08
br i1 %47, label %48, label %49
48: ; preds = %45
store i32 9, i32* %2
br label %100
49: ; preds = %45
%50 = load float, float* %3
%51 = fcmp oge float %50, 1.000000e+07
br i1 %51, label %52, label %53
52: ; preds = %49
store i32 8, i32* %2
br label %100
53: ; preds = %49
%54 = load float, float* %3
%55 = fcmp oge float %54, 1.000000e+06
br i1 %55, label %56, label %57
56: ; preds = %53
store i32 7, i32* %2
br label %100
57: ; preds = %53
%58 = load float, float* %3
%59 = fcmp oge float %58, 1.000000e+05
br i1 %59, label %60, label %61
60: ; preds = %57
store i32 6, i32* %2
br label %100
61: ; preds = %57
%62 = load float, float* %3
%63 = fcmp oge float %62, 1.000000e+04
br i1 %63, label %64, label %65
64: ; preds = %61
store i32 5, i32* %2
br label %100
65: ; preds = %61
%66 = load float, float* %3
%67 = fcmp oge float %66, 1.000000e+03
br i1 %67, label %68, label %69
68: ; preds = %65
store i32 4, i32* %2
br label %100
69: ; preds = %65
%70 = load float, float* %3
%71 = fcmp oge float %70, 1.000000e+02
br i1 %71, label %72, label %73
72: ; preds = %69
store i32 3, i32* %2
br label %100
73: ; preds = %69
%74 = load float, float* %3
%75 = fcmp oge float %74, 1.000000e+01
br i1 %75, label %76, label %77
76: ; preds = %73
store i32 2, i32* %2
br label %100
77: ; preds = %73
%78 = load float, float* %3
%79 = fcmp oge float %78, 1.000000e+00
br i1 %79, label %80, label %81
80: ; preds = %77
store i32 1, i32* %2
br label %100
81: ; preds = %77
br label %82
82: ; preds = %81
br label %83
83: ; preds = %82
br label %84
84: ; preds = %83
br label %85
85: ; preds = %84
br label %86
86: ; preds = %85
br label %87
87: ; preds = %86
br label %88
88: ; preds = %87
br label %89
89: ; preds = %88
br label %90
90: ; preds = %89
br label %91
91: ; preds = %90
br label %92
92: ; preds = %91
br label %93
93: ; preds = %92
br label %94
94: ; preds = %93
br label %95
95: ; preds = %94
br label %96
96: ; preds = %95
br label %97
97: ; preds = %96
br label %98
98: ; preds = %97
br label %99
99: ; preds = %98
store i32 0, i32* %2
br label %100
100: ; preds = %99, %80, %76, %72, %68, %64, %60, %56, %52, %48, %44, %40, %36, %32, %28, %24, %20, %16, %12, %8
%101 = load i32, i32* %2
ret i32 %101
}

LLVM IR (-O2):
define i32 @GetDigits(float %0) {
%2 = tail call float @llvm.fabs.f32(float %0)
%3 = fcmp ult float %2, 0x43ABC16D60000000
br i1 %3, label %4, label %41
4: ; preds = %1
%5 = fcmp ult float %2, 0x4376345780000000
br i1 %5, label %6, label %41
6: ; preds = %4
%7 = fcmp ult float %2, 0x4341C37940000000
br i1 %7, label %8, label %41
8: ; preds = %6
%9 = fcmp ult float %2, 0x430C6BF520000000
br i1 %9, label %10, label %41
10: ; preds = %8
%11 = fcmp ult float %2, 0x42D6BCC420000000
br i1 %11, label %12, label %41
12: ; preds = %10
%13 = fcmp ult float %2, 0x42A2309CE0000000
br i1 %13, label %14, label %41
14: ; preds = %12
%15 = fcmp ult float %2, 0x426D1A94A0000000
br i1 %15, label %16, label %41
16: ; preds = %14
%17 = fcmp ult float %2, 0x42374876E0000000
br i1 %17, label %18, label %41
18: ; preds = %16
%19 = fcmp ult float %2, 1.000000e+10
br i1 %19, label %20, label %41
20: ; preds = %18
%21 = fcmp ult float %2, 1.000000e+09
br i1 %21, label %22, label %41
22: ; preds = %20
%23 = fcmp ult float %2, 1.000000e+08
br i1 %23, label %24, label %41
24: ; preds = %22
%25 = fcmp ult float %2, 1.000000e+07
br i1 %25, label %26, label %41
26: ; preds = %24
%27 = fcmp ult float %2, 1.000000e+06
br i1 %27, label %28, label %41
28: ; preds = %26
%29 = fcmp ult float %2, 1.000000e+05
br i1 %29, label %30, label %41
30: ; preds = %28
%31 = fcmp ult float %2, 1.000000e+04
br i1 %31, label %32, label %41
32: ; preds = %30
%33 = fcmp ult float %2, 1.000000e+03
br i1 %33, label %34, label %41
34: ; preds = %32
%35 = fcmp ult float %2, 1.000000e+02
br i1 %35, label %36, label %41
36: ; preds = %34
%37 = fcmp ult float %2, 1.000000e+01
br i1 %37, label %38, label %41
38: ; preds = %36
%39 = fcmp oge float %2, 1.000000e+00
%40 = zext i1 %39 to i32
br label %41
41: ; preds = %38, %36, %34, %32, %30, %28, %26, %24, %22, %20, %18, %16, %14, %12, %10, %8, %6, %4, %1
%42 = phi i32 [ 19, %1 ], [ 18, %4 ], [ 17, %6 ], [ 16, %8 ], [ 15, %10 ], [ 14, %12 ], [ 13, %14 ], [ 12, %16 ], [ 11, %18 ], [ 10, %20 ], [ 9, %22 ], [ 8, %24 ], [ 7, %26 ], [ 6, %28 ], [ 5, %30 ], [ 4, %32 ], [ 3, %34 ], [ 2, %36 ], [ %40, %38 ]
ret i32 %42
}