#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 */
typedef struct TYPE_2__ TYPE_1__;

/* Type definitions */
struct TYPE_2__ {
  scalar_t__ rem;
};

/* Variables and functions */
TYPE_1__ div(int, int);
char *strchr(char *, char);
int strlen(char *);
int strspn(char *, char *);
int erromatarra_da(char *hitza) {
  unsigned int i = 0, total = 0;
  int itzul[80];
  int errom_zifrak[7] = {1, 5, 10, 50, 100, 500, 1000};
  int posizioak[80];
  int zenbat_jarraian = 1;
  int azkena_kendu = 1000;
  if (strspn(hitza, "IVXLCDM") == strlen(hitza)) {
    for (i = 0; i < strlen(hitza); i++) {
      posizioak[i] = 7 - strlen(strchr("IVXLCDM", hitza[i]));
      itzul[i] = errom_zifrak[posizioak[i]];
      if (i > 0) {
        if (itzul[i] == itzul[i - 1]) {
          zenbat_jarraian++;
          if ((zenbat_jarraian > 3 && itzul[i] != 1000) ||
              (zenbat_jarraian > 1 && div(posizioak[i], 2).rem != 0))
            return (0);
        } else if (zenbat_jarraian > 1 && itzul[i] > itzul[i - 1])
          return (0);
        else {
          if (itzul[i] > itzul[i - 1])
            if (azkena_kendu > itzul[i - 1])
              azkena_kendu = itzul[i - 1];
            else
              return (0);
          else if (azkena_kendu == itzul[i])
            return (0);
          zenbat_jarraian = 1;
        }
      }
    }
    total = itzul[strlen(hitza) - 1];
    if (strlen(hitza) > 1) {
      for (i = strlen(hitza) - 2; i >= 0; i--) {
        if (itzul[i] < itzul[i + 1]) {
          if (div(posizioak[i + 1], 2).rem == 0)
            if ((posizioak[i + 1] - posizioak[i]) != 2)
              return (0);
            else {
              total -= itzul[i];
            }
          else if ((posizioak[i + 1] - posizioak[i]) != 1)
            return (0);
          else {
            total -= itzul[i];
          }
        } else {
          total += itzul[i];
        }
        if (i == 0)
          return (total);
      }
    } else
      return (total);
  }
  return (total);
}


x86 assembly (clang, -O0):
<erromatarra_da>:
push   %rbp
mov    %rsp,%rbp
sub    $0x2e0,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    0xe9c(%rip),%rax
mov    %rax,-0x180(%rbp)
mov    0xe96(%rip),%rax
mov    %rax,-0x178(%rbp)
mov    0xe90(%rip),%rax
mov    %rax,-0x170(%rbp)
mov    0xe8b(%rip),%eax
mov    %eax,-0x168(%rbp)
movl   $0x1,-0x2c4(%rbp)
movl   $0x3e8,-0x2c8(%rbp)
mov    -0x10(%rbp),%rdi
lea    0xe6a(%rip),%rsi
call   1050 <strspn@plt>
mov    %eax,-0x2dc(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,%ecx
mov    -0x2dc(%rbp),%eax
cmp    %ecx,%eax
jne    1542 <erromatarra_da+0x402>
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x2e0(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,%ecx
mov    -0x2e0(%rbp),%eax
cmp    %ecx,%eax
jae    13d6 <erromatarra_da+0x296>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
lea    0xe0f(%rip),%rdi
movsbl (%rax,%rcx,1),%esi
call   1040 <strchr@plt>
mov    %rax,%rdi
call   1030 <strlen@plt>
mov    $0x7,%ecx
sub    %eax,%ecx
mov    -0x14(%rbp),%eax
mov    %ecx,-0x2c0(%rbp,%rax,4)
mov    -0x14(%rbp),%eax
movslq -0x2c0(%rbp,%rax,4),%rax
ff
mov    -0x180(%rbp,%rax,4),%ecx
mov    -0x14(%rbp),%eax
mov    %ecx,-0x160(%rbp,%rax,4)
cmpl   $0x0,-0x14(%rbp)
jbe    13c3 <erromatarra_da+0x283>
mov    -0x14(%rbp),%eax
mov    -0x160(%rbp,%rax,4),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
cmp    -0x160(%rbp,%rcx,4),%eax
jne    12eb <erromatarra_da+0x1ab>
mov    -0x2c4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c4(%rbp)
cmpl   $0x3,-0x2c4(%rbp)
jle    12a4 <erromatarra_da+0x164>
mov    -0x14(%rbp),%eax
cmpl   $0x3e8,-0x160(%rbp,%rax,4)
jne    12da <erromatarra_da+0x19a>
cmpl   $0x1,-0x2c4(%rbp)
jle    12e6 <erromatarra_da+0x1a6>
mov    -0x14(%rbp),%eax
mov    -0x2c0(%rbp,%rax,4),%edi
mov    $0x2,%esi
call   1060 <div@plt>
mov    %rax,-0x2d0(%rbp)
cmpq   $0x0,-0x2d0(%rbp)
je     12e6 <erromatarra_da+0x1a6>
movl   $0x0,-0x4(%rbp)
jmp    1548 <erromatarra_da+0x408>
jmp    13be <erromatarra_da+0x27e>
cmpl   $0x1,-0x2c4(%rbp)
jle    1323 <erromatarra_da+0x1e3>
mov    -0x14(%rbp),%eax
mov    -0x160(%rbp,%rax,4),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
cmp    -0x160(%rbp,%rcx,4),%eax
jle    1323 <erromatarra_da+0x1e3>
movl   $0x0,-0x4(%rbp)
jmp    1548 <erromatarra_da+0x408>
mov    -0x14(%rbp),%eax
mov    -0x160(%rbp,%rax,4),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
cmp    -0x160(%rbp,%rcx,4),%eax
jle    1388 <erromatarra_da+0x248>
mov    -0x2c8(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
cmp    -0x160(%rbp,%rcx,4),%eax
jle    1377 <erromatarra_da+0x237>
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %eax,%eax
mov    -0x160(%rbp,%rax,4),%eax
mov    %eax,-0x2c8(%rbp)
jmp    1383 <erromatarra_da+0x243>
movl   $0x0,-0x4(%rbp)
jmp    1548 <erromatarra_da+0x408>
jmp    13af <erromatarra_da+0x26f>
mov    -0x2c8(%rbp),%eax
mov    -0x14(%rbp),%ecx
cmp    -0x160(%rbp,%rcx,4),%eax
jne    13aa <erromatarra_da+0x26a>
movl   $0x0,-0x4(%rbp)
jmp    1548 <erromatarra_da+0x408>
jmp    13af <erromatarra_da+0x26f>
movl   $0x1,-0x2c4(%rbp)
jmp    13be <erromatarra_da+0x27e>
jmp    13c3 <erromatarra_da+0x283>
jmp    13c8 <erromatarra_da+0x288>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    11dd <erromatarra_da+0x9d>
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
sub    $0x1,%eax
cltq
mov    -0x160(%rbp,%rax,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
cmp    $0x1,%eax
jle    1532 <erromatarra_da+0x3f2>
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
sub    $0x2,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jb     152d <erromatarra_da+0x3ed>
mov    -0x14(%rbp),%eax
mov    -0x160(%rbp,%rax,4),%eax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
cmp    -0x160(%rbp,%rcx,4),%eax
jge    14f5 <erromatarra_da+0x3b5>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,%eax
mov    -0x2c0(%rbp,%rax,4),%edi
mov    $0x2,%esi
call   1060 <div@plt>
mov    %rax,-0x2d8(%rbp)
cmpq   $0x0,-0x2d8(%rbp)
jne    14ab <erromatarra_da+0x36b>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,%eax
mov    -0x2c0(%rbp,%rax,4),%eax
mov    -0x14(%rbp),%ecx
sub    -0x2c0(%rbp,%rcx,4),%eax
cmp    $0x2,%eax
je     1494 <erromatarra_da+0x354>
movl   $0x0,-0x4(%rbp)
jmp    1548 <erromatarra_da+0x408>
mov    -0x14(%rbp),%eax
mov    -0x160(%rbp,%rax,4),%ecx
mov    -0x18(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x18(%rbp)
jmp    14f0 <erromatarra_da+0x3b0>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,%eax
mov    -0x2c0(%rbp,%rax,4),%eax
mov    -0x14(%rbp),%ecx
sub    -0x2c0(%rbp,%rcx,4),%eax
cmp    $0x1,%eax
je     14d9 <erromatarra_da+0x399>
movl   $0x0,-0x4(%rbp)
jmp    1548 <erromatarra_da+0x408>
mov    -0x14(%rbp),%eax
mov    -0x160(%rbp,%rax,4),%ecx
mov    -0x18(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x18(%rbp)
jmp    14f0 <erromatarra_da+0x3b0>
jmp    1505 <erromatarra_da+0x3c5>
mov    -0x14(%rbp),%eax
mov    -0x160(%rbp,%rax,4),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    151a <erromatarra_da+0x3da>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1548 <erromatarra_da+0x408>
jmp    151f <erromatarra_da+0x3df>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    140f <erromatarra_da+0x2cf>
jmp    153d <erromatarra_da+0x3fd>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1548 <erromatarra_da+0x408>
jmp    1542 <erromatarra_da+0x402>
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x2e0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<erromatarra_da>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x288,%rsp
mov    %rdi,%rbx
lea    0xec1(%rip),%rsi
call   1050 <strspn@plt>
mov    %eax,%ebp
mov    %rbx,%rdi
call   1030 <strlen@plt>
cmp    %eax,%ebp
jne    12fc <erromatarra_da+0x1bc>
mov    %rbx,%rdi
call   1030 <strlen@plt>
test   %eax,%eax
je     1277 <erromatarra_da+0x137>
mov    $0x1,%r14d
mov    $0x3e8,%r12d
xor    %ebp,%ebp
jmp    11bd <erromatarra_da+0x7d>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r14d,%r13d
add    $0x1,%rbp
mov    %rbx,%rdi
call   1030 <strlen@plt>
mov    %eax,%eax
mov    %r13d,%r14d
cmp    %rax,%rbp
jae    1277 <erromatarra_da+0x137>
movsbl (%rbx,%rbp,1),%esi
lea    0xe54(%rip),%rdi
call   1040 <strchr@plt>
mov    %rax,%rdi
call   1030 <strlen@plt>
mov    $0x7,%edi
sub    %eax,%edi
mov    %edi,0x140(%rsp,%rbp,4)
movslq %edi,%rcx
lea    0xe13(%rip),%rdx
mov    (%rdx,%rcx,4),%ecx
mov    %ecx,(%rsp,%rbp,4)
test   %rbp,%rbp
je     11a0 <erromatarra_da+0x60>
mov    -0x4(%rsp,%rbp,4),%edx
xor    %r15d,%r15d
cmp    %edx,%ecx
jne    1240 <erromatarra_da+0x100>
cmp    $0x3,%r14d
jl     1212 <erromatarra_da+0xd2>
cmp    $0x1,%eax
jne    12ff <erromatarra_da+0x1bf>
lea    0x1(%r14),%r13d
test   %r14d,%r14d
jle    11a3 <erromatarra_da+0x63>
mov    $0x2,%esi
call   1060 <div@plt>
test   %rax,%rax
je     11a3 <erromatarra_da+0x63>
jmp    12ff <erromatarra_da+0x1bf>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmp    $0x2,%r14d
jl     124e <erromatarra_da+0x10e>
cmp    %edx,%ecx
jg     12ff <erromatarra_da+0x1bf>
mov    $0x1,%r13d
cmp    %edx,%ecx
jle    1269 <erromatarra_da+0x129>
cmp    %edx,%r12d
mov    %edx,%r12d
jg     11a3 <erromatarra_da+0x63>
jmp    12ff <erromatarra_da+0x1bf>
cmp    %ecx,%r12d
jne    11a3 <erromatarra_da+0x63>
jmp    12ff <erromatarra_da+0x1bf>
mov    %rbx,%rdi
call   1030 <strlen@plt>
cltq
mov    -0x4(%rsp,%rax,4),%r15d
mov    %rbx,%rdi
call   1030 <strlen@plt>
cmp    $0x2,%eax
jl     12ff <erromatarra_da+0x1bf>
mov    %rbx,%rdi
call   1030 <strlen@plt>
mov    %eax,%ebx
add    $0xfffffffe,%ebx
add    $0x1,%rbx
jmp    12b9 <erromatarra_da+0x179>
cs nopw 0x0(%rax,%rax,1)
add    %r14d,%r15d
add    $0xffffffffffffffff,%rbx
je     12ff <erromatarra_da+0x1bf>
mov    -0x4(%rsp,%rbx,4),%r14d
mov    %ebx,%eax
cmp    (%rsp,%rax,4),%r14d
jge    12b0 <erromatarra_da+0x170>
mov    0x140(%rsp,%rax,4),%ebp
mov    %ebp,%edi
mov    $0x2,%esi
call   1060 <div@plt>
sub    0x13c(%rsp,%rbx,4),%ebp
test   %rax,%rax
je     12ec <erromatarra_da+0x1ac>
cmp    $0x1,%ebp
je     12f1 <erromatarra_da+0x1b1>
jmp    12fc <erromatarra_da+0x1bc>
cmp    $0x2,%ebp
jne    12fc <erromatarra_da+0x1bc>
sub    %r14d,%r15d
add    $0xffffffffffffffff,%rbx
jne    12b9 <erromatarra_da+0x179>
jmp    12ff <erromatarra_da+0x1bf>
xor    %r15d,%r15d
mov    %r15d,%eax
add    $0x288,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
%struct.TYPE_2__ = type { i64 }
@__const.erromatarra_da.errom_zifrak = [7 x i32] [i32 1, i32 5, i32 10, i32 50, i32 100, i32 500, i32 1000]
@.str = [8 x i8] c"IVXLCDM\00"
define i32 @erromatarra_da(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca [80 x i32]
%7 = alloca [7 x i32]
%8 = alloca [80 x i32]
%9 = alloca i32
%10 = alloca i32
%11 = alloca %struct.TYPE_2__
%12 = alloca %struct.TYPE_2__
store i8* %0, i8** %3
store i32 0, i32* %4
store i32 0, i32* %5
%13 = bitcast [7 x i32]* %7 to i8*
store i32 1, i32* %9
store i32 1000, i32* %10
%14 = load i8*, i8** %3
%15 = call i32 @strspn(i8* %14, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0))
%16 = load i8*, i8** %3
%17 = call i32 @strlen(i8* %16)
%18 = icmp eq i32 %15, %17
br i1 %18, label %19, label %246
19: ; preds = %1
store i32 0, i32* %4
br label %20
20: ; preds = %141, %19
%21 = load i32, i32* %4
%22 = load i8*, i8** %3
%23 = call i32 @strlen(i8* %22)
%24 = icmp ult i32 %21, %23
br i1 %24, label %25, label %144
25: ; preds = %20
%26 = load i8*, i8** %3
%27 = load i32, i32* %4
%28 = zext i32 %27 to i64
%29 = getelementptr inbounds i8, i8* %26, i64 %28
%30 = load i8, i8* %29
%31 = call i8* @strchr(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i8 signext %30)
%32 = call i32 @strlen(i8* %31)
%33 = sub nsw i32 7, %32
%34 = load i32, i32* %4
%35 = zext i32 %34 to i64
%36 = getelementptr inbounds [80 x i32], [80 x i32]* %8, i64 0, i64 %35
store i32 %33, i32* %36
%37 = load i32, i32* %4
%38 = zext i32 %37 to i64
%39 = getelementptr inbounds [80 x i32], [80 x i32]* %8, i64 0, i64 %38
%40 = load i32, i32* %39
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds [7 x i32], [7 x i32]* %7, i64 0, i64 %41
%43 = load i32, i32* %42
%44 = load i32, i32* %4
%45 = zext i32 %44 to i64
%46 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %45
store i32 %43, i32* %46
%47 = load i32, i32* %4
%48 = icmp ugt i32 %47, 0
br i1 %48, label %49, label %140
49: ; preds = %25
%50 = load i32, i32* %4
%51 = zext i32 %50 to i64
%52 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %51
%53 = load i32, i32* %52
%54 = load i32, i32* %4
%55 = sub i32 %54, 1
%56 = zext i32 %55 to i64
%57 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %56
%58 = load i32, i32* %57
%59 = icmp eq i32 %53, %58
br i1 %59, label %60, label %86
60: ; preds = %49
%61 = load i32, i32* %9
%62 = add nsw i32 %61, 1
store i32 %62, i32* %9
%63 = load i32, i32* %9
%64 = icmp sgt i32 %63, 3
br i1 %64, label %65, label %71
65: ; preds = %60
%66 = load i32, i32* %4
%67 = zext i32 %66 to i64
%68 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %67
%69 = load i32, i32* %68
%70 = icmp ne i32 %69, 1000
br i1 %70, label %84, label %71
71: ; preds = %65, %60
%72 = load i32, i32* %9
%73 = icmp sgt i32 %72, 1
br i1 %73, label %74, label %85
74: ; preds = %71
%75 = load i32, i32* %4
%76 = zext i32 %75 to i64
%77 = getelementptr inbounds [80 x i32], [80 x i32]* %8, i64 0, i64 %76
%78 = load i32, i32* %77
%79 = call i64 @div(i32 %78, i32 2)
%80 = getelementptr inbounds %struct.TYPE_2__, %struct.TYPE_2__* %11, i32 0, i32 0
store i64 %79, i64* %80
%81 = getelementptr inbounds %struct.TYPE_2__, %struct.TYPE_2__* %11, i32 0, i32 0
%82 = load i64, i64* %81
%83 = icmp ne i64 %82, 0
br i1 %83, label %84, label %85
84: ; preds = %74, %65
store i32 0, i32* %2
br label %248
85: ; preds = %74, %71
br label %139
86: ; preds = %49
%87 = load i32, i32* %9
%88 = icmp sgt i32 %87, 1
br i1 %88, label %89, label %101
89: ; preds = %86
%90 = load i32, i32* %4
%91 = zext i32 %90 to i64
%92 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %91
%93 = load i32, i32* %92
%94 = load i32, i32* %4
%95 = sub i32 %94, 1
%96 = zext i32 %95 to i64
%97 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %96
%98 = load i32, i32* %97
%99 = icmp sgt i32 %93, %98
br i1 %99, label %100, label %101
100: ; preds = %89
store i32 0, i32* %2
br label %248
101: ; preds = %89, %86
%102 = load i32, i32* %4
%103 = zext i32 %102 to i64
%104 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %103
%105 = load i32, i32* %104
%106 = load i32, i32* %4
%107 = sub i32 %106, 1
%108 = zext i32 %107 to i64
%109 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %108
%110 = load i32, i32* %109
%111 = icmp sgt i32 %105, %110
br i1 %111, label %112, label %128
112: ; preds = %101
%113 = load i32, i32* %10
%114 = load i32, i32* %4
%115 = sub i32 %114, 1
%116 = zext i32 %115 to i64
%117 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %116
%118 = load i32, i32* %117
%119 = icmp sgt i32 %113, %118
br i1 %119, label %120, label %126
120: ; preds = %112
%121 = load i32, i32* %4
%122 = sub i32 %121, 1
%123 = zext i32 %122 to i64
%124 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %123
%125 = load i32, i32* %124
store i32 %125, i32* %10
br label %127
126: ; preds = %112
store i32 0, i32* %2
br label %248
127: ; preds = %120
br label %137
128: ; preds = %101
%129 = load i32, i32* %10
%130 = load i32, i32* %4
%131 = zext i32 %130 to i64
%132 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %131
%133 = load i32, i32* %132
%134 = icmp eq i32 %129, %133
br i1 %134, label %135, label %136
135: ; preds = %128
store i32 0, i32* %2
br label %248
136: ; preds = %128
br label %137
137: ; preds = %136, %127
store i32 1, i32* %9
br label %138
138: ; preds = %137
br label %139
139: ; preds = %138, %85
br label %140
140: ; preds = %139, %25
br label %141
141: ; preds = %140
%142 = load i32, i32* %4
%143 = add i32 %142, 1
store i32 %143, i32* %4
br label %20
144: ; preds = %20
%145 = load i8*, i8** %3
%146 = call i32 @strlen(i8* %145)
%147 = sub nsw i32 %146, 1
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %148
%150 = load i32, i32* %149
store i32 %150, i32* %5
%151 = load i8*, i8** %3
%152 = call i32 @strlen(i8* %151)
%153 = icmp sgt i32 %152, 1
br i1 %153, label %154, label %243
154: ; preds = %144
%155 = load i8*, i8** %3
%156 = call i32 @strlen(i8* %155)
%157 = sub nsw i32 %156, 2
store i32 %157, i32* %4
br label %158
158: ; preds = %239, %154
%159 = load i32, i32* %4
%160 = icmp uge i32 %159, 0
br i1 %160, label %161, label %242
161: ; preds = %158
%162 = load i32, i32* %4
%163 = zext i32 %162 to i64
%164 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %163
%165 = load i32, i32* %164
%166 = load i32, i32* %4
%167 = add i32 %166, 1
%168 = zext i32 %167 to i64
%169 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %168
%170 = load i32, i32* %169
%171 = icmp slt i32 %165, %170
br i1 %171, label %172, label %226
172: ; preds = %161
%173 = load i32, i32* %4
%174 = add i32 %173, 1
%175 = zext i32 %174 to i64
%176 = getelementptr inbounds [80 x i32], [80 x i32]* %8, i64 0, i64 %175
%177 = load i32, i32* %176
%178 = call i64 @div(i32 %177, i32 2)
%179 = getelementptr inbounds %struct.TYPE_2__, %struct.TYPE_2__* %12, i32 0, i32 0
store i64 %178, i64* %179
%180 = getelementptr inbounds %struct.TYPE_2__, %struct.TYPE_2__* %12, i32 0, i32 0
%181 = load i64, i64* %180
%182 = icmp eq i64 %181, 0
br i1 %182, label %183, label %204
183: ; preds = %172
%184 = load i32, i32* %4
%185 = add i32 %184, 1
%186 = zext i32 %185 to i64
%187 = getelementptr inbounds [80 x i32], [80 x i32]* %8, i64 0, i64 %186
%188 = load i32, i32* %187
%189 = load i32, i32* %4
%190 = zext i32 %189 to i64
%191 = getelementptr inbounds [80 x i32], [80 x i32]* %8, i64 0, i64 %190
%192 = load i32, i32* %191
%193 = sub nsw i32 %188, %192
%194 = icmp ne i32 %193, 2
br i1 %194, label %195, label %196
195: ; preds = %183
store i32 0, i32* %2
br label %248
196: ; preds = %183
%197 = load i32, i32* %4
%198 = zext i32 %197 to i64
%199 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %198
%200 = load i32, i32* %199
%201 = load i32, i32* %5
%202 = sub i32 %201, %200
store i32 %202, i32* %5
br label %203
203: ; preds = %196
br label %225
204: ; preds = %172
%205 = load i32, i32* %4
%206 = add i32 %205, 1
%207 = zext i32 %206 to i64
%208 = getelementptr inbounds [80 x i32], [80 x i32]* %8, i64 0, i64 %207
%209 = load i32, i32* %208
%210 = load i32, i32* %4
%211 = zext i32 %210 to i64
%212 = getelementptr inbounds [80 x i32], [80 x i32]* %8, i64 0, i64 %211
%213 = load i32, i32* %212
%214 = sub nsw i32 %209, %213
%215 = icmp ne i32 %214, 1
br i1 %215, label %216, label %217
216: ; preds = %204
store i32 0, i32* %2
br label %248
217: ; preds = %204
%218 = load i32, i32* %4
%219 = zext i32 %218 to i64
%220 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %219
%221 = load i32, i32* %220
%222 = load i32, i32* %5
%223 = sub i32 %222, %221
store i32 %223, i32* %5
br label %224
224: ; preds = %217
br label %225
225: ; preds = %224, %203
br label %233
226: ; preds = %161
%227 = load i32, i32* %4
%228 = zext i32 %227 to i64
%229 = getelementptr inbounds [80 x i32], [80 x i32]* %6, i64 0, i64 %228
%230 = load i32, i32* %229
%231 = load i32, i32* %5
%232 = add i32 %231, %230
store i32 %232, i32* %5
br label %233
233: ; preds = %226, %225
%234 = load i32, i32* %4
%235 = icmp eq i32 %234, 0
br i1 %235, label %236, label %238
236: ; preds = %233
%237 = load i32, i32* %5
store i32 %237, i32* %2
br label %248
238: ; preds = %233
br label %239
239: ; preds = %238
%240 = load i32, i32* %4
%241 = add i32 %240, -1
store i32 %241, i32* %4
br label %158
242: ; preds = %158
br label %245
243: ; preds = %144
%244 = load i32, i32* %5
store i32 %244, i32* %2
br label %248
245: ; preds = %242
br label %246
246: ; preds = %245, %1
%247 = load i32, i32* %5
store i32 %247, i32* %2
br label %248
248: ; preds = %246, %243, %236, %216, %195, %135, %126, %100, %84
%249 = load i32, i32* %2
ret i32 %249
}

LLVM IR (-O2):
@__const.erromatarra_da.errom_zifrak = [7 x i32] [i32 1, i32 5, i32 10, i32 50, i32 100, i32 500, i32 1000]
@.str = [8 x i8] c"IVXLCDM\00"
define i32 @erromatarra_da(i8* %0) {
%2 = alloca [80 x i32]
%3 = alloca [80 x i32]
%4 = bitcast [80 x i32]* %2 to i8*
%5 = bitcast [80 x i32]* %3 to i8*
%6 = tail call i32 @strspn(i8* %0, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0))
%7 = tail call i32 @strlen(i8* %0)
%8 = icmp eq i32 %6, %7
br i1 %8, label %9, label %102
9: ; preds = %1
%10 = tail call i32 @strlen(i8* %0)
%11 = icmp eq i32 %10, 0
br i1 %11, label %58, label %12
12: ; preds = %9, %51
%13 = phi i64 [ %54, %51 ], [ 0, %9 ]
%14 = phi i32 [ %53, %51 ], [ 1000, %9 ]
%15 = phi i32 [ %52, %51 ], [ 1, %9 ]
%16 = getelementptr inbounds i8, i8* %0, i64 %13
%17 = load i8, i8* %16
%18 = tail call i8* @strchr(i8* dereferenceable(8) getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0), i8 signext %17)
%19 = tail call i32 @strlen(i8* %18)
%20 = sub nsw i32 7, %19
%21 = getelementptr inbounds [80 x i32], [80 x i32]* %3, i64 0, i64 %13
store i32 %20, i32* %21
%22 = sext i32 %20 to i64
%23 = getelementptr inbounds [7 x i32], [7 x i32]* @__const.erromatarra_da.errom_zifrak, i64 0, i64 %22
%24 = load i32, i32* %23
%25 = getelementptr inbounds [80 x i32], [80 x i32]* %2, i64 0, i64 %13
store i32 %24, i32* %25
%26 = icmp eq i64 %13, 0
br i1 %26, label %51, label %27
27: ; preds = %12
%28 = add nsw i64 %13, -1
%29 = getelementptr inbounds [80 x i32], [80 x i32]* %2, i64 0, i64 %28
%30 = load i32, i32* %29
%31 = icmp eq i32 %24, %30
br i1 %31, label %32, label %42
32: ; preds = %27
%33 = add nsw i32 %15, 1
%34 = icmp slt i32 %15, 3
%35 = icmp eq i32 %19, 1
%36 = select i1 %34, i1 true, i1 %35
br i1 %36, label %37, label %102
37: ; preds = %32
%38 = icmp sgt i32 %15, 0
br i1 %38, label %39, label %51
39: ; preds = %37
%40 = tail call i64 @div(i32 %20, i32 2)
%41 = icmp eq i64 %40, 0
br i1 %41, label %51, label %102
42: ; preds = %27
%43 = icmp sgt i32 %15, 1
%44 = icmp sgt i32 %24, %30
%45 = select i1 %43, i1 %44, i1 false
br i1 %45, label %102, label %46
46: ; preds = %42
br i1 %44, label %47, label %49
47: ; preds = %46
%48 = icmp sgt i32 %14, %30
br i1 %48, label %51, label %102
49: ; preds = %46
%50 = icmp eq i32 %14, %24
br i1 %50, label %102, label %51
51: ; preds = %49, %47, %12, %37, %39
%52 = phi i32 [ %33, %39 ], [ %33, %37 ], [ %15, %12 ], [ 1, %47 ], [ 1, %49 ]
%53 = phi i32 [ %14, %39 ], [ %14, %37 ], [ %14, %12 ], [ %30, %47 ], [ %14, %49 ]
%54 = add nuw nsw i64 %13, 1
%55 = tail call i32 @strlen(i8* %0)
%56 = zext i32 %55 to i64
%57 = icmp ult i64 %54, %56
br i1 %57, label %12, label %58
58: ; preds = %51, %9
%59 = tail call i32 @strlen(i8* %0)
%60 = add nsw i32 %59, -1
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds [80 x i32], [80 x i32]* %2, i64 0, i64 %61
%63 = load i32, i32* %62
%64 = tail call i32 @strlen(i8* %0)
%65 = icmp sgt i32 %64, 1
br i1 %65, label %66, label %102
66: ; preds = %58
%67 = tail call i32 @strlen(i8* %0)
%68 = add i32 %67, -2
%69 = zext i32 %68 to i64
br label %70
70: ; preds = %98, %66
%71 = phi i64 [ %101, %98 ], [ %69, %66 ]
%72 = phi i32 [ %99, %98 ], [ %63, %66 ]
%73 = getelementptr inbounds [80 x i32], [80 x i32]* %2, i64 0, i64 %71
%74 = load i32, i32* %73
%75 = add nuw i64 %71, 1
%76 = and i64 %75, 4294967295
%77 = getelementptr inbounds [80 x i32], [80 x i32]* %2, i64 0, i64 %76
%78 = load i32, i32* %77
%79 = icmp slt i32 %74, %78
br i1 %79, label %80, label %96
80: ; preds = %70
%81 = getelementptr inbounds [80 x i32], [80 x i32]* %3, i64 0, i64 %76
%82 = load i32, i32* %81
%83 = tail call i64 @div(i32 %82, i32 2)
%84 = icmp eq i64 %83, 0
%85 = getelementptr inbounds [80 x i32], [80 x i32]* %3, i64 0, i64 %71
%86 = load i32, i32* %85
%87 = sub nsw i32 %82, %86
br i1 %84, label %88, label %92
88: ; preds = %80
%89 = icmp eq i32 %87, 2
br i1 %89, label %90, label %102
90: ; preds = %88
%91 = sub i32 %72, %74
br label %98
92: ; preds = %80
%93 = icmp eq i32 %87, 1
br i1 %93, label %94, label %102
94: ; preds = %92
%95 = sub i32 %72, %74
br label %98
96: ; preds = %70
%97 = add i32 %74, %72
br label %98
98: ; preds = %90, %94, %96
%99 = phi i32 [ %91, %90 ], [ %95, %94 ], [ %97, %96 ]
%100 = icmp eq i64 %71, 0
%101 = add nsw i64 %71, -1
br i1 %100, label %102, label %70
102: ; preds = %49, %47, %42, %39, %32, %98, %92, %88, %1, %58
%103 = phi i32 [ %63, %58 ], [ 0, %1 ], [ %99, %98 ], [ 0, %92 ], [ 0, %88 ], [ 0, %32 ], [ 0, %39 ], [ 0, %42 ], [ 0, %47 ], [ 0, %49 ]
ret i32 %103
}