int count_in_roman(int src) {
  int count = 0;
  while (src != 0) {
    if (src >= 1000) {
      count++;
      src -= 1000;
    } else if (src >= 900) {
      count += 2;
      src -= 900;
    } else if (src >= 500) {
      count++;
      src -= 500;
    } else if (src >= 400) {
      count += 2;
      src -= 400;
    } else if (src >= 100) {
      count++;
      src -= 100;
    } else if (src >= 90) {
      count += 2;
      src -= 90;
    } else if (src >= 50) {
      count++;
      src -= 50;
    } else if (src >= 40) {
      count += 2;
      src -= 40;
    } else if (src >= 10) {
      count++;
      src -= 10;
    } else if (src >= 9) {
      count += 2;
      src -= 9;
    } else if (src >= 5) {
      count++;
      src -= 5;
    } else if (src >= 4) {
      count += 2;
      src -= 4;
    } else if (src >= 1) {
      count++;
      src -= 1;
    }
  }
  return count;
}


x86 assembly (clang, -O0):
<count_in_roman>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
cmpl   $0x0,-0x4(%rbp)
je     1315 <count_in_roman+0x215>
cmpl   $0x3e8,-0x4(%rbp)
jl     113e <count_in_roman+0x3e>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x3e8,%eax
mov    %eax,-0x4(%rbp)
jmp    1310 <count_in_roman+0x210>
cmpl   $0x384,-0x4(%rbp)
jl     1164 <count_in_roman+0x64>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x384,%eax
mov    %eax,-0x4(%rbp)
jmp    130b <count_in_roman+0x20b>
cmpl   $0x1f4,-0x4(%rbp)
jl     118a <count_in_roman+0x8a>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x1f4,%eax
mov    %eax,-0x4(%rbp)
jmp    1306 <count_in_roman+0x206>
cmpl   $0x190,-0x4(%rbp)
jl     11b0 <count_in_roman+0xb0>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x190,%eax
mov    %eax,-0x4(%rbp)
jmp    1301 <count_in_roman+0x201>
cmpl   $0x64,-0x4(%rbp)
jl     11d1 <count_in_roman+0xd1>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x64,%eax
mov    %eax,-0x4(%rbp)
jmp    12fc <count_in_roman+0x1fc>
cmpl   $0x5a,-0x4(%rbp)
jl     11f2 <count_in_roman+0xf2>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x5a,%eax
mov    %eax,-0x4(%rbp)
jmp    12f7 <count_in_roman+0x1f7>
cmpl   $0x32,-0x4(%rbp)
jl     1213 <count_in_roman+0x113>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x32,%eax
mov    %eax,-0x4(%rbp)
jmp    12f2 <count_in_roman+0x1f2>
cmpl   $0x28,-0x4(%rbp)
jl     1234 <count_in_roman+0x134>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x28,%eax
mov    %eax,-0x4(%rbp)
jmp    12ed <count_in_roman+0x1ed>
cmpl   $0xa,-0x4(%rbp)
jl     1255 <count_in_roman+0x155>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0xa,%eax
mov    %eax,-0x4(%rbp)
jmp    12e8 <count_in_roman+0x1e8>
cmpl   $0x9,-0x4(%rbp)
jl     1276 <count_in_roman+0x176>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x9,%eax
mov    %eax,-0x4(%rbp)
jmp    12e3 <count_in_roman+0x1e3>
cmpl   $0x5,-0x4(%rbp)
jl     1297 <count_in_roman+0x197>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x5,%eax
mov    %eax,-0x4(%rbp)
jmp    12de <count_in_roman+0x1de>
cmpl   $0x4,-0x4(%rbp)
jl     12b8 <count_in_roman+0x1b8>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x4,%eax
mov    %eax,-0x4(%rbp)
jmp    12d9 <count_in_roman+0x1d9>
cmpl   $0x1,-0x4(%rbp)
jl     12d4 <count_in_roman+0x1d4>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    12d9 <count_in_roman+0x1d9>
jmp    12de <count_in_roman+0x1de>
jmp    12e3 <count_in_roman+0x1e3>
jmp    12e8 <count_in_roman+0x1e8>
jmp    12ed <count_in_roman+0x1ed>
jmp    12f2 <count_in_roman+0x1f2>
jmp    12f7 <count_in_roman+0x1f7>
jmp    12fc <count_in_roman+0x1fc>
jmp    1301 <count_in_roman+0x201>
jmp    1306 <count_in_roman+0x206>
jmp    130b <count_in_roman+0x20b>
jmp    1310 <count_in_roman+0x210>
jmp    110e <count_in_roman+0xe>
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<count_in_roman>:
test   %edi,%edi
je     123a <count_in_roman+0x13a>
movd   %edi,%xmm0
pshufd $0x51,%xmm0,%xmm0
movdqa 0xf87(%rip),%xmm1
movdqa 0xf6f(%rip),%xmm2
movdqa 0xf57(%rip),%xmm3
movdqa 0xf3f(%rip),%xmm4
movdqa 0xf27(%rip),%xmm5
movdqa 0xf0f(%rip),%xmm6
movdqa 0xef6(%rip),%xmm12
movdqa 0xedd(%rip),%xmm8
movdqa 0xec4(%rip),%xmm9
movdqa 0xeab(%rip),%xmm10
movdqa 0xe92(%rip),%xmm11
jmp    1185 <count_in_roman+0x85>
paddd  %xmm1,%xmm0
pshufd $0x55,%xmm0,%xmm7
movd   %xmm7,%eax
test   %eax,%eax
je     1235 <count_in_roman+0x135>
pshufd $0x55,%xmm0,%xmm7
movd   %xmm7,%eax
cmp    $0x3e8,%eax
jge    1170 <count_in_roman+0x70>
cmp    $0x384,%eax
jl     11b0 <count_in_roman+0xb0>
paddd  %xmm2,%xmm0
jmp    1174 <count_in_roman+0x74>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
cmp    $0x1f4,%eax
jl     11bd <count_in_roman+0xbd>
paddd  %xmm3,%xmm0
jmp    1174 <count_in_roman+0x74>
cmp    $0x190,%eax
jl     11ca <count_in_roman+0xca>
paddd  %xmm4,%xmm0
jmp    1174 <count_in_roman+0x74>
cmp    $0x64,%eax
jl     11d5 <count_in_roman+0xd5>
paddd  %xmm5,%xmm0
jmp    1174 <count_in_roman+0x74>
cmp    $0x5a,%eax
jl     11e0 <count_in_roman+0xe0>
paddd  %xmm6,%xmm0
jmp    1174 <count_in_roman+0x74>
cmp    $0x32,%eax
jl     11ec <count_in_roman+0xec>
paddd  %xmm12,%xmm0
jmp    1174 <count_in_roman+0x74>
cmp    $0x28,%eax
jl     11fb <count_in_roman+0xfb>
paddd  %xmm8,%xmm0
jmp    1174 <count_in_roman+0x74>
cmp    $0xa,%eax
jl     120a <count_in_roman+0x10a>
paddd  %xmm9,%xmm0
jmp    1174 <count_in_roman+0x74>
cmp    $0x9,%eax
je     123d <count_in_roman+0x13d>
cmp    $0x5,%eax
jl     121e <count_in_roman+0x11e>
paddd  %xmm10,%xmm0
jmp    1174 <count_in_roman+0x74>
cmp    $0x4,%eax
je     123d <count_in_roman+0x13d>
test   %eax,%eax
jle    1174 <count_in_roman+0x74>
paddd  %xmm11,%xmm0
jmp    1174 <count_in_roman+0x74>
movd   %xmm0,%eax
ret
xor    %eax,%eax
ret
movd   %xmm0,%eax
add    $0x2,%eax
ret

LLVM IR (-O0):
define i32 @count_in_roman(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
store i32 0, i32* %3
br label %4
4: ; preds = %123, %1
%5 = load i32, i32* %2
%6 = icmp ne i32 %5, 0
br i1 %6, label %7, label %124
7: ; preds = %4
%8 = load i32, i32* %2
%9 = icmp sge i32 %8, 1000
br i1 %9, label %10, label %15
10: ; preds = %7
%11 = load i32, i32* %3
%12 = add nsw i32 %11, 1
store i32 %12, i32* %3
%13 = load i32, i32* %2
%14 = sub nsw i32 %13, 1000
store i32 %14, i32* %2
br label %123
15: ; preds = %7
%16 = load i32, i32* %2
%17 = icmp sge i32 %16, 900
br i1 %17, label %18, label %23
18: ; preds = %15
%19 = load i32, i32* %3
%20 = add nsw i32 %19, 2
store i32 %20, i32* %3
%21 = load i32, i32* %2
%22 = sub nsw i32 %21, 900
store i32 %22, i32* %2
br label %122
23: ; preds = %15
%24 = load i32, i32* %2
%25 = icmp sge i32 %24, 500
br i1 %25, label %26, label %31
26: ; preds = %23
%27 = load i32, i32* %3
%28 = add nsw i32 %27, 1
store i32 %28, i32* %3
%29 = load i32, i32* %2
%30 = sub nsw i32 %29, 500
store i32 %30, i32* %2
br label %121
31: ; preds = %23
%32 = load i32, i32* %2
%33 = icmp sge i32 %32, 400
br i1 %33, label %34, label %39
34: ; preds = %31
%35 = load i32, i32* %3
%36 = add nsw i32 %35, 2
store i32 %36, i32* %3
%37 = load i32, i32* %2
%38 = sub nsw i32 %37, 400
store i32 %38, i32* %2
br label %120
39: ; preds = %31
%40 = load i32, i32* %2
%41 = icmp sge i32 %40, 100
br i1 %41, label %42, label %47
42: ; preds = %39
%43 = load i32, i32* %3
%44 = add nsw i32 %43, 1
store i32 %44, i32* %3
%45 = load i32, i32* %2
%46 = sub nsw i32 %45, 100
store i32 %46, i32* %2
br label %119
47: ; preds = %39
%48 = load i32, i32* %2
%49 = icmp sge i32 %48, 90
br i1 %49, label %50, label %55
50: ; preds = %47
%51 = load i32, i32* %3
%52 = add nsw i32 %51, 2
store i32 %52, i32* %3
%53 = load i32, i32* %2
%54 = sub nsw i32 %53, 90
store i32 %54, i32* %2
br label %118
55: ; preds = %47
%56 = load i32, i32* %2
%57 = icmp sge i32 %56, 50
br i1 %57, label %58, label %63
58: ; preds = %55
%59 = load i32, i32* %3
%60 = add nsw i32 %59, 1
store i32 %60, i32* %3
%61 = load i32, i32* %2
%62 = sub nsw i32 %61, 50
store i32 %62, i32* %2
br label %117
63: ; preds = %55
%64 = load i32, i32* %2
%65 = icmp sge i32 %64, 40
br i1 %65, label %66, label %71
66: ; preds = %63
%67 = load i32, i32* %3
%68 = add nsw i32 %67, 2
store i32 %68, i32* %3
%69 = load i32, i32* %2
%70 = sub nsw i32 %69, 40
store i32 %70, i32* %2
br label %116
71: ; preds = %63
%72 = load i32, i32* %2
%73 = icmp sge i32 %72, 10
br i1 %73, label %74, label %79
74: ; preds = %71
%75 = load i32, i32* %3
%76 = add nsw i32 %75, 1
store i32 %76, i32* %3
%77 = load i32, i32* %2
%78 = sub nsw i32 %77, 10
store i32 %78, i32* %2
br label %115
79: ; preds = %71
%80 = load i32, i32* %2
%81 = icmp sge i32 %80, 9
br i1 %81, label %82, label %87
82: ; preds = %79
%83 = load i32, i32* %3
%84 = add nsw i32 %83, 2
store i32 %84, i32* %3
%85 = load i32, i32* %2
%86 = sub nsw i32 %85, 9
store i32 %86, i32* %2
br label %114
87: ; preds = %79
%88 = load i32, i32* %2
%89 = icmp sge i32 %88, 5
br i1 %89, label %90, label %95
90: ; preds = %87
%91 = load i32, i32* %3
%92 = add nsw i32 %91, 1
store i32 %92, i32* %3
%93 = load i32, i32* %2
%94 = sub nsw i32 %93, 5
store i32 %94, i32* %2
br label %113
95: ; preds = %87
%96 = load i32, i32* %2
%97 = icmp sge i32 %96, 4
br i1 %97, label %98, label %103
98: ; preds = %95
%99 = load i32, i32* %3
%100 = add nsw i32 %99, 2
store i32 %100, i32* %3
%101 = load i32, i32* %2
%102 = sub nsw i32 %101, 4
store i32 %102, i32* %2
br label %112
103: ; preds = %95
%104 = load i32, i32* %2
%105 = icmp sge i32 %104, 1
br i1 %105, label %106, label %111
106: ; preds = %103
%107 = load i32, i32* %3
%108 = add nsw i32 %107, 1
store i32 %108, i32* %3
%109 = load i32, i32* %2
%110 = sub nsw i32 %109, 1
store i32 %110, i32* %2
br label %111
111: ; preds = %106, %103
br label %112
112: ; preds = %111, %98
br label %113
113: ; preds = %112, %90
br label %114
114: ; preds = %113, %82
br label %115
115: ; preds = %114, %74
br label %116
116: ; preds = %115, %66
br label %117
117: ; preds = %116, %58
br label %118
118: ; preds = %117, %50
br label %119
119: ; preds = %118, %42
br label %120
120: ; preds = %119, %34
br label %121
121: ; preds = %120, %26
br label %122
122: ; preds = %121, %18
br label %123
123: ; preds = %122, %10
br label %4
124: ; preds = %4
%125 = load i32, i32* %3
ret i32 %125
}

LLVM IR (-O2):
define i32 @count_in_roman(i32 %0) {
%2 = icmp eq i32 %0, 0
br i1 %2, label %67, label %3
3: ; preds = %1
%4 = insertelement <2 x i32> <i32 0, i32 poison>, i32 %0, i64 1
br label %5
5: ; preds = %3, %61
%6 = phi <2 x i32> [ %62, %61 ], [ %4, %3 ]
%7 = extractelement <2 x i32> %6, i64 1
%8 = icmp sgt i32 %7, 999
br i1 %8, label %9, label %11
9: ; preds = %5
%10 = add nsw <2 x i32> %6, <i32 1, i32 -1000>
br label %61
11: ; preds = %5
%12 = icmp sgt i32 %7, 899
br i1 %12, label %13, label %15
13: ; preds = %11
%14 = add nsw <2 x i32> %6, <i32 2, i32 -900>
br label %61
15: ; preds = %11
%16 = icmp sgt i32 %7, 499
br i1 %16, label %17, label %19
17: ; preds = %15
%18 = add nsw <2 x i32> %6, <i32 1, i32 -500>
br label %61
19: ; preds = %15
%20 = icmp sgt i32 %7, 399
br i1 %20, label %21, label %23
21: ; preds = %19
%22 = add nsw <2 x i32> %6, <i32 2, i32 -400>
br label %61
23: ; preds = %19
%24 = icmp sgt i32 %7, 99
br i1 %24, label %25, label %27
25: ; preds = %23
%26 = add nsw <2 x i32> %6, <i32 1, i32 -100>
br label %61
27: ; preds = %23
%28 = icmp sgt i32 %7, 89
br i1 %28, label %29, label %31
29: ; preds = %27
%30 = add nsw <2 x i32> %6, <i32 2, i32 -90>
br label %61
31: ; preds = %27
%32 = icmp sgt i32 %7, 49
br i1 %32, label %33, label %35
33: ; preds = %31
%34 = add nsw <2 x i32> %6, <i32 1, i32 -50>
br label %61
35: ; preds = %31
%36 = icmp sgt i32 %7, 39
br i1 %36, label %37, label %39
37: ; preds = %35
%38 = add nsw <2 x i32> %6, <i32 2, i32 -40>
br label %61
39: ; preds = %35
%40 = icmp sgt i32 %7, 9
br i1 %40, label %41, label %43
41: ; preds = %39
%42 = add nsw <2 x i32> %6, <i32 1, i32 -10>
br label %61
43: ; preds = %39
%44 = icmp eq i32 %7, 9
br i1 %44, label %45, label %48
45: ; preds = %43
%46 = extractelement <2 x i32> %6, i64 0
%47 = add nsw i32 %46, 2
br label %67
48: ; preds = %43
%49 = icmp sgt i32 %7, 4
br i1 %49, label %50, label %52
50: ; preds = %48
%51 = add nsw <2 x i32> %6, <i32 1, i32 -5>
br label %61
52: ; preds = %48
%53 = icmp eq i32 %7, 4
br i1 %53, label %54, label %57
54: ; preds = %52
%55 = extractelement <2 x i32> %6, i64 0
%56 = add nsw i32 %55, 2
br label %67
57: ; preds = %52
%58 = icmp sgt i32 %7, 0
%59 = add nsw <2 x i32> %6, <i32 1, i32 -1>
%60 = select i1 %58, <2 x i32> %59, <2 x i32> %6
br label %61
61: ; preds = %57, %13, %21, %29, %37, %50, %41, %33, %25, %17, %9
%62 = phi <2 x i32> [ %10, %9 ], [ %14, %13 ], [ %18, %17 ], [ %22, %21 ], [ %26, %25 ], [ %30, %29 ], [ %34, %33 ], [ %38, %37 ], [ %42, %41 ], [ %51, %50 ], [ %60, %57 ]
%63 = extractelement <2 x i32> %62, i64 1
%64 = icmp eq i32 %63, 0
br i1 %64, label %65, label %5
65: ; preds = %61
%66 = extractelement <2 x i32> %62, i64 0
br label %67
67: ; preds = %65, %54, %45, %1
%68 = phi i32 [ 0, %1 ], [ %56, %54 ], [ %47, %45 ], [ %66, %65 ]
ret i32 %68
}