int romanToInt(char *s) {
  int i = 0, r = 0;
  while (s[i] != '\0') {
    if (s[i] == 'M') {
      r += 1000;
      i++;
    } else if (s[i] == 'D') {
      r += 500;
      i++;
    } else if (s[i] == 'C') {
      if (s[i + 1] == 'D') {
        r += 400;
        i += 2;
      } else if (s[i + 1] == 'M') {
        r += 900;
        i += 2;
      } else {
        r += 100;
        i++;
      }
    } else if (s[i] == 'L') {
      r += 50;
      i++;
    } else if (s[i] == 'X') {
      if (s[i + 1] == 'L') {
        r += 40;
        i += 2;
      } else if (s[i + 1] == 'C') {
        r += 90;
        i += 2;
      } else {
        r += 10;
        i++;
      }
    } else if (s[i] == 'V') {
      r += 5;
      i++;
    } else {
      if (s[i + 1] == 'V') {
        r += 4;
        i += 2;
      } else if (s[i + 1] == 'X') {
        r += 9;
        i += 2;
      } else {
        r += 1;
        i++;
      }
    }
  }
  return r;
}


x86 assembly (clang, -O0):
<romanToInt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     13a5 <romanToInt+0x2a5>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x4d,%eax
jne    1159 <romanToInt+0x59>
mov    -0x10(%rbp),%eax
add    $0x3e8,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    13a0 <romanToInt+0x2a0>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x44,%eax
jne    1187 <romanToInt+0x87>
mov    -0x10(%rbp),%eax
add    $0x1f4,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    139b <romanToInt+0x29b>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x43,%eax
jne    121e <romanToInt+0x11e>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x44,%eax
jne    11cf <romanToInt+0xcf>
mov    -0x10(%rbp),%eax
add    $0x190,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0xc(%rbp)
jmp    1219 <romanToInt+0x119>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x4d,%eax
jne    1202 <romanToInt+0x102>
mov    -0x10(%rbp),%eax
add    $0x384,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0xc(%rbp)
jmp    1214 <romanToInt+0x114>
mov    -0x10(%rbp),%eax
add    $0x64,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1219 <romanToInt+0x119>
jmp    1396 <romanToInt+0x296>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x4c,%eax
jne    124a <romanToInt+0x14a>
mov    -0x10(%rbp),%eax
add    $0x32,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1391 <romanToInt+0x291>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x58,%eax
jne    12dd <romanToInt+0x1dd>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x4c,%eax
jne    1290 <romanToInt+0x190>
mov    -0x10(%rbp),%eax
add    $0x28,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0xc(%rbp)
jmp    12d8 <romanToInt+0x1d8>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x43,%eax
jne    12c1 <romanToInt+0x1c1>
mov    -0x10(%rbp),%eax
add    $0x5a,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0xc(%rbp)
jmp    12d3 <romanToInt+0x1d3>
mov    -0x10(%rbp),%eax
add    $0xa,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    12d8 <romanToInt+0x1d8>
jmp    138c <romanToInt+0x28c>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x56,%eax
jne    1309 <romanToInt+0x209>
mov    -0x10(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1387 <romanToInt+0x287>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x56,%eax
jne    133a <romanToInt+0x23a>
mov    -0x10(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0xc(%rbp)
jmp    1382 <romanToInt+0x282>
mov    -0x8(%rbp),%rax
mov    -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x58,%eax
jne    136b <romanToInt+0x26b>
mov    -0x10(%rbp),%eax
add    $0x9,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0xc(%rbp)
jmp    137d <romanToInt+0x27d>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1382 <romanToInt+0x282>
jmp    1387 <romanToInt+0x287>
jmp    138c <romanToInt+0x28c>
jmp    1391 <romanToInt+0x291>
jmp    1396 <romanToInt+0x296>
jmp    139b <romanToInt+0x29b>
jmp    13a0 <romanToInt+0x2a0>
jmp    1116 <romanToInt+0x16>
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<romanToInt>:
xor    %r9d,%r9d
lea    0xef6(%rip),%r8
xor    %eax,%eax
jmp    1120 <romanToInt+0x20>
add    $0x5,%eax
add    $0x1,%r9d
cs nopw 0x0(%rax,%rax,1)
nop
movslq %r9d,%rsi
movzbl (%rdi,%rsi,1),%ecx
lea    -0x43(%rcx),%edx
cmp    $0x15,%dl
ja     1194 <romanToInt+0x94>
movzbl %dl,%ecx
movslq (%r8,%rcx,4),%rcx
add    %r8,%rcx
jmp    *%rcx
movzbl 0x1(%rdi,%rsi,1),%ecx
cmp    $0x4d,%cl
je     11ce <romanToInt+0xce>
cmp    $0x44,%cl
jne    11dc <romanToInt+0xdc>
add    $0x190,%eax
add    $0x2,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x1f4,%eax
add    $0x1,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x32,%eax
add    $0x1,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x3e8,%eax
add    $0x1,%r9d
jmp    1120 <romanToInt+0x20>
movzbl 0x1(%rdi,%rsi,1),%ecx
cmp    $0x43,%cl
je     11eb <romanToInt+0xeb>
cmp    $0x4c,%cl
jne    11f7 <romanToInt+0xf7>
add    $0x28,%eax
add    $0x2,%r9d
jmp    1120 <romanToInt+0x20>
test   %cl,%cl
je     1206 <romanToInt+0x106>
movzbl 0x1(%rdi,%rsi,1),%ecx
cmp    $0x58,%cl
je     11b3 <romanToInt+0xb3>
cmp    $0x56,%cl
jne    11bf <romanToInt+0xbf>
add    $0x4,%eax
add    $0x2,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x9,%eax
add    $0x2,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x1,%rsi
add    $0x1,%eax
mov    %esi,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x384,%eax
add    $0x2,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x1,%rsi
add    $0x64,%eax
mov    %esi,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x5a,%eax
add    $0x2,%r9d
jmp    1120 <romanToInt+0x20>
add    $0x1,%rsi
add    $0xa,%eax
mov    %esi,%r9d
jmp    1120 <romanToInt+0x20>
ret

LLVM IR (-O0):
define i32 @romanToInt(i8* %0) {
%2 = alloca i8*
%3 = alloca i32
%4 = alloca i32
store i8* %0, i8** %2
store i32 0, i32* %3
store i32 0, i32* %4
br label %5
5: ; preds = %191, %1
%6 = load i8*, i8** %2
%7 = load i32, i32* %3
%8 = sext i32 %7 to i64
%9 = getelementptr inbounds i8, i8* %6, i64 %8
%10 = load i8, i8* %9
%11 = sext i8 %10 to i32
%12 = icmp ne i32 %11, 0
br i1 %12, label %13, label %192
13: ; preds = %5
%14 = load i8*, i8** %2
%15 = load i32, i32* %3
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds i8, i8* %14, i64 %16
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = icmp eq i32 %19, 77
br i1 %20, label %21, label %26
21: ; preds = %13
%22 = load i32, i32* %4
%23 = add nsw i32 %22, 1000
store i32 %23, i32* %4
%24 = load i32, i32* %3
%25 = add nsw i32 %24, 1
store i32 %25, i32* %3
br label %191
26: ; preds = %13
%27 = load i8*, i8** %2
%28 = load i32, i32* %3
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8, i8* %27, i64 %29
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = icmp eq i32 %32, 68
br i1 %33, label %34, label %39
34: ; preds = %26
%35 = load i32, i32* %4
%36 = add nsw i32 %35, 500
store i32 %36, i32* %4
%37 = load i32, i32* %3
%38 = add nsw i32 %37, 1
store i32 %38, i32* %3
br label %190
39: ; preds = %26
%40 = load i8*, i8** %2
%41 = load i32, i32* %3
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i8, i8* %40, i64 %42
%44 = load i8, i8* %43
%45 = sext i8 %44 to i32
%46 = icmp eq i32 %45, 67
br i1 %46, label %47, label %82
47: ; preds = %39
%48 = load i8*, i8** %2
%49 = load i32, i32* %3
%50 = add nsw i32 %49, 1
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %48, i64 %51
%53 = load i8, i8* %52
%54 = sext i8 %53 to i32
%55 = icmp eq i32 %54, 68
br i1 %55, label %56, label %61
56: ; preds = %47
%57 = load i32, i32* %4
%58 = add nsw i32 %57, 400
store i32 %58, i32* %4
%59 = load i32, i32* %3
%60 = add nsw i32 %59, 2
store i32 %60, i32* %3
br label %81
61: ; preds = %47
%62 = load i8*, i8** %2
%63 = load i32, i32* %3
%64 = add nsw i32 %63, 1
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds i8, i8* %62, i64 %65
%67 = load i8, i8* %66
%68 = sext i8 %67 to i32
%69 = icmp eq i32 %68, 77
br i1 %69, label %70, label %75
70: ; preds = %61
%71 = load i32, i32* %4
%72 = add nsw i32 %71, 900
store i32 %72, i32* %4
%73 = load i32, i32* %3
%74 = add nsw i32 %73, 2
store i32 %74, i32* %3
br label %80
75: ; preds = %61
%76 = load i32, i32* %4
%77 = add nsw i32 %76, 100
store i32 %77, i32* %4
%78 = load i32, i32* %3
%79 = add nsw i32 %78, 1
store i32 %79, i32* %3
br label %80
80: ; preds = %75, %70
br label %81
81: ; preds = %80, %56
br label %189
82: ; preds = %39
%83 = load i8*, i8** %2
%84 = load i32, i32* %3
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds i8, i8* %83, i64 %85
%87 = load i8, i8* %86
%88 = sext i8 %87 to i32
%89 = icmp eq i32 %88, 76
br i1 %89, label %90, label %95
90: ; preds = %82
%91 = load i32, i32* %4
%92 = add nsw i32 %91, 50
store i32 %92, i32* %4
%93 = load i32, i32* %3
%94 = add nsw i32 %93, 1
store i32 %94, i32* %3
br label %188
95: ; preds = %82
%96 = load i8*, i8** %2
%97 = load i32, i32* %3
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i8, i8* %96, i64 %98
%100 = load i8, i8* %99
%101 = sext i8 %100 to i32
%102 = icmp eq i32 %101, 88
br i1 %102, label %103, label %138
103: ; preds = %95
%104 = load i8*, i8** %2
%105 = load i32, i32* %3
%106 = add nsw i32 %105, 1
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds i8, i8* %104, i64 %107
%109 = load i8, i8* %108
%110 = sext i8 %109 to i32
%111 = icmp eq i32 %110, 76
br i1 %111, label %112, label %117
112: ; preds = %103
%113 = load i32, i32* %4
%114 = add nsw i32 %113, 40
store i32 %114, i32* %4
%115 = load i32, i32* %3
%116 = add nsw i32 %115, 2
store i32 %116, i32* %3
br label %137
117: ; preds = %103
%118 = load i8*, i8** %2
%119 = load i32, i32* %3
%120 = add nsw i32 %119, 1
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %118, i64 %121
%123 = load i8, i8* %122
%124 = sext i8 %123 to i32
%125 = icmp eq i32 %124, 67
br i1 %125, label %126, label %131
126: ; preds = %117
%127 = load i32, i32* %4
%128 = add nsw i32 %127, 90
store i32 %128, i32* %4
%129 = load i32, i32* %3
%130 = add nsw i32 %129, 2
store i32 %130, i32* %3
br label %136
131: ; preds = %117
%132 = load i32, i32* %4
%133 = add nsw i32 %132, 10
store i32 %133, i32* %4
%134 = load i32, i32* %3
%135 = add nsw i32 %134, 1
store i32 %135, i32* %3
br label %136
136: ; preds = %131, %126
br label %137
137: ; preds = %136, %112
br label %187
138: ; preds = %95
%139 = load i8*, i8** %2
%140 = load i32, i32* %3
%141 = sext i32 %140 to i64
%142 = getelementptr inbounds i8, i8* %139, i64 %141
%143 = load i8, i8* %142
%144 = sext i8 %143 to i32
%145 = icmp eq i32 %144, 86
br i1 %145, label %146, label %151
146: ; preds = %138
%147 = load i32, i32* %4
%148 = add nsw i32 %147, 5
store i32 %148, i32* %4
%149 = load i32, i32* %3
%150 = add nsw i32 %149, 1
store i32 %150, i32* %3
br label %186
151: ; preds = %138
%152 = load i8*, i8** %2
%153 = load i32, i32* %3
%154 = add nsw i32 %153, 1
%155 = sext i32 %154 to i64
%156 = getelementptr inbounds i8, i8* %152, i64 %155
%157 = load i8, i8* %156
%158 = sext i8 %157 to i32
%159 = icmp eq i32 %158, 86
br i1 %159, label %160, label %165
160: ; preds = %151
%161 = load i32, i32* %4
%162 = add nsw i32 %161, 4
store i32 %162, i32* %4
%163 = load i32, i32* %3
%164 = add nsw i32 %163, 2
store i32 %164, i32* %3
br label %185
165: ; preds = %151
%166 = load i8*, i8** %2
%167 = load i32, i32* %3
%168 = add nsw i32 %167, 1
%169 = sext i32 %168 to i64
%170 = getelementptr inbounds i8, i8* %166, i64 %169
%171 = load i8, i8* %170
%172 = sext i8 %171 to i32
%173 = icmp eq i32 %172, 88
br i1 %173, label %174, label %179
174: ; preds = %165
%175 = load i32, i32* %4
%176 = add nsw i32 %175, 9
store i32 %176, i32* %4
%177 = load i32, i32* %3
%178 = add nsw i32 %177, 2
store i32 %178, i32* %3
br label %184
179: ; preds = %165
%180 = load i32, i32* %4
%181 = add nsw i32 %180, 1
store i32 %181, i32* %4
%182 = load i32, i32* %3
%183 = add nsw i32 %182, 1
store i32 %183, i32* %3
br label %184
184: ; preds = %179, %174
br label %185
185: ; preds = %184, %160
br label %186
186: ; preds = %185, %146
br label %187
187: ; preds = %186, %137
br label %188
188: ; preds = %187, %90
br label %189
189: ; preds = %188, %81
br label %190
190: ; preds = %189, %34
br label %191
191: ; preds = %190, %21
br label %5
192: ; preds = %5
%193 = load i32, i32* %4
ret i32 %193
}

LLVM IR (-O2):
define i32 @romanToInt(i8* nocapture %0) {
br label %2
2: ; preds = %14, %1
%3 = phi i32 [ 0, %1 ], [ %15, %14 ]
%4 = phi i32 [ 0, %1 ], [ %16, %14 ]
%5 = sext i32 %3 to i64
%6 = getelementptr inbounds i8, i8* %0, i64 %5
%7 = load i8, i8* %6
switch i8 %7, label %49 [
i8 0, label %62
i8 77, label %8
i8 68, label %11
i8 67, label %17
i8 76, label %30
i8 88, label %33
i8 86, label %46
]
8: ; preds = %2
%9 = add nsw i32 %4, 1000
%10 = add nsw i32 %3, 1
br label %14
11: ; preds = %2
%12 = add nsw i32 %4, 500
%13 = add nsw i32 %3, 1
br label %14
14: ; preds = %11, %30, %46, %57, %60, %54, %38, %44, %41, %22, %28, %25, %8
%15 = phi i32 [ %10, %8 ], [ %13, %11 ], [ %24, %22 ], [ %27, %25 ], [ %18, %28 ], [ %32, %30 ], [ %40, %38 ], [ %43, %41 ], [ %34, %44 ], [ %48, %46 ], [ %56, %54 ], [ %59, %57 ], [ %50, %60 ]
%16 = phi i32 [ %9, %8 ], [ %12, %11 ], [ %23, %22 ], [ %26, %25 ], [ %29, %28 ], [ %31, %30 ], [ %39, %38 ], [ %42, %41 ], [ %45, %44 ], [ %47, %46 ], [ %55, %54 ], [ %58, %57 ], [ %61, %60 ]
br label %2
17: ; preds = %2
%18 = add nsw i32 %3, 1
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i8, i8* %0, i64 %19
%21 = load i8, i8* %20
switch i8 %21, label %28 [
i8 68, label %22
i8 77, label %25
]
22: ; preds = %17
%23 = add nsw i32 %4, 400
%24 = add nsw i32 %3, 2
br label %14
25: ; preds = %17
%26 = add nsw i32 %4, 900
%27 = add nsw i32 %3, 2
br label %14
28: ; preds = %17
%29 = add nsw i32 %4, 100
br label %14
30: ; preds = %2
%31 = add nsw i32 %4, 50
%32 = add nsw i32 %3, 1
br label %14
33: ; preds = %2
%34 = add nsw i32 %3, 1
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i8, i8* %0, i64 %35
%37 = load i8, i8* %36
switch i8 %37, label %44 [
i8 76, label %38
i8 67, label %41
]
38: ; preds = %33
%39 = add nsw i32 %4, 40
%40 = add nsw i32 %3, 2
br label %14
41: ; preds = %33
%42 = add nsw i32 %4, 90
%43 = add nsw i32 %3, 2
br label %14
44: ; preds = %33
%45 = add nsw i32 %4, 10
br label %14
46: ; preds = %2
%47 = add nsw i32 %4, 5
%48 = add nsw i32 %3, 1
br label %14
49: ; preds = %2
%50 = add nsw i32 %3, 1
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %0, i64 %51
%53 = load i8, i8* %52
switch i8 %53, label %60 [
i8 86, label %54
i8 88, label %57
]
54: ; preds = %49
%55 = add nsw i32 %4, 4
%56 = add nsw i32 %3, 2
br label %14
57: ; preds = %49
%58 = add nsw i32 %4, 9
%59 = add nsw i32 %3, 2
br label %14
60: ; preds = %49
%61 = add nsw i32 %4, 1
br label %14
62: ; preds = %2
ret i32 %4
}