#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 */
int romanToInt(char *s) {
  if (s == NULL)
    return 0;
  int result = 0;
  while (*s) {
    switch (*s) {
    case 'I':
      if (*(s + 1) == 'V') {
        result += 4;
        s += 2;
      } else if (*(s + 1) == 'X') {
        result += 9;
        s += 2;
      } else {
        result += 1;
        s++;
      }
      break;
    case 'X':
      if (*(s + 1) == 'L') {
        result += 40;
        s += 2;
      } else if (*(s + 1) == 'C') {
        result += 90;
        s += 2;
      } else {
        result += 10;
        s++;
      }
      break;
    case 'C':
      if (*(s + 1) == 'D') {
        result += 400;
        s += 2;
      } else if (*(s + 1) == 'M') {
        result += 900;
        s += 2;
      } else {
        result += 100;
        s++;
      }
      break;
    case 'V':
      result += 5;
      s++;
      break;
    case 'L':
      result += 50;
      s++;
      break;
    case 'D':
      result += 500;
      s++;
      break;
    case 'M':
      result += 1000;
      s++;
      break;
    default:
      break;
    }
  }
  return result;
}


x86 assembly (clang, -O0):
<romanToInt>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    111f <romanToInt+0x1f>
movl   $0x0,-0x4(%rbp)
jmp    133f <romanToInt+0x23f>
movl   $0x0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     1339 <romanToInt+0x239>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
add    $0xffffffbd,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x15,%eax
ja     132f <romanToInt+0x22f>
mov    -0x20(%rbp),%rax
lea    0xea9(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x56,%eax
jne    118b <romanToInt+0x8b>
mov    -0x14(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    11d0 <romanToInt+0xd0>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x58,%eax
jne    11b6 <romanToInt+0xb6>
mov    -0x14(%rbp),%eax
add    $0x9,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    11cb <romanToInt+0xcb>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    11d0 <romanToInt+0xd0>
jmp    1334 <romanToInt+0x234>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x4c,%eax
jne    1200 <romanToInt+0x100>
mov    -0x14(%rbp),%eax
add    $0x28,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    1245 <romanToInt+0x145>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x43,%eax
jne    122b <romanToInt+0x12b>
mov    -0x14(%rbp),%eax
add    $0x5a,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    1240 <romanToInt+0x140>
mov    -0x14(%rbp),%eax
add    $0xa,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1245 <romanToInt+0x145>
jmp    1334 <romanToInt+0x234>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x44,%eax
jne    1277 <romanToInt+0x177>
mov    -0x14(%rbp),%eax
add    $0x190,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    12be <romanToInt+0x1be>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x4d,%eax
jne    12a4 <romanToInt+0x1a4>
mov    -0x14(%rbp),%eax
add    $0x384,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    12b9 <romanToInt+0x1b9>
mov    -0x14(%rbp),%eax
add    $0x64,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    12be <romanToInt+0x1be>
jmp    1334 <romanToInt+0x234>
mov    -0x14(%rbp),%eax
add    $0x5,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1334 <romanToInt+0x234>
mov    -0x14(%rbp),%eax
add    $0x32,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1334 <romanToInt+0x234>
mov    -0x14(%rbp),%eax
add    $0x1f4,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1334 <romanToInt+0x234>
mov    -0x14(%rbp),%eax
add    $0x3e8,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1334 <romanToInt+0x234>
jmp    1334 <romanToInt+0x234>
jmp    1126 <romanToInt+0x26>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<romanToInt>:
xor    %eax,%eax
test   %rdi,%rdi
je     11ea <romanToInt+0xea>
mov    (%rdi),%dl
test   %dl,%dl
je     11ea <romanToInt+0xea>
xor    %eax,%eax
lea    0xee2(%rip),%rcx
jmp    1134 <romanToInt+0x34>
add    $0x1f4,%eax
add    $0x1,%rdi
movzbl (%rdi),%edx
test   %dl,%dl
je     11ea <romanToInt+0xea>
movsbl %dl,%edx
add    $0xffffffbd,%edx
cmp    $0x15,%edx
ja     1129 <romanToInt+0x29>
movslq (%rcx,%rdx,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
movzbl 0x1(%rdi),%edx
cmp    $0x4d,%dl
je     11a0 <romanToInt+0xa0>
cmp    $0x44,%dl
jne    11ae <romanToInt+0xae>
add    $0x190,%eax
add    $0x2,%rdi
jmp    1129 <romanToInt+0x29>
add    $0x5,%eax
jmp    1125 <romanToInt+0x25>
movzbl 0x1(%rdi),%edx
cmp    $0x58,%dl
je     11ba <romanToInt+0xba>
cmp    $0x56,%dl
jne    11c6 <romanToInt+0xc6>
add    $0x4,%eax
add    $0x2,%rdi
jmp    1129 <romanToInt+0x29>
add    $0x32,%eax
jmp    1125 <romanToInt+0x25>
add    $0x3e8,%eax
jmp    1125 <romanToInt+0x25>
movzbl 0x1(%rdi),%edx
cmp    $0x43,%dl
je     11d2 <romanToInt+0xd2>
cmp    $0x4c,%dl
jne    11de <romanToInt+0xde>
add    $0x28,%eax
add    $0x2,%rdi
jmp    1129 <romanToInt+0x29>
add    $0x384,%eax
add    $0x2,%rdi
jmp    1129 <romanToInt+0x29>
add    $0x1,%rdi
add    $0x64,%eax
jmp    112c <romanToInt+0x2c>
add    $0x9,%eax
add    $0x2,%rdi
jmp    1129 <romanToInt+0x29>
add    $0x1,%rdi
add    $0x1,%eax
jmp    112c <romanToInt+0x2c>
add    $0x5a,%eax
add    $0x2,%rdi
jmp    1129 <romanToInt+0x29>
add    $0x1,%rdi
add    $0xa,%eax
jmp    112c <romanToInt+0x2c>
ret

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

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