unsigned long read_next_motion_line(unsigned char *bvhdata,
                                    unsigned long bvhdata_size,
                                    unsigned char **data) {
  static unsigned long first_motion_line = 0L;
  static unsigned long next = 0L;
  unsigned long i, length = 0L;
  if (0L == first_motion_line) {
    for (i = 0; i < (bvhdata_size - 10); i++) {
      if ((bvhdata[i] == 'F') && (bvhdata[i + 1] == 'r') &&
          (bvhdata[i + 2] == 'a') && (bvhdata[i + 3] == 'm') &&
          (bvhdata[i + 4] == 'e') && (bvhdata[i + 5] == ' ') &&
          (bvhdata[i + 6] == 'T') && (bvhdata[i + 7] == 'i') &&
          (bvhdata[i + 8] == 'm') && (bvhdata[i + 9] == 'e'))
        break;
    }
    for (; i < bvhdata_size; i++) {
      if ((bvhdata[i] == '\n') || (bvhdata[i] == '\r'))
        break;
    }
    for (; i < bvhdata_size; i++) {
      if ((bvhdata[i] == '-') || ((bvhdata[i] >= '0') && (bvhdata[i] <= '9')))
        break;
    }
    if (i >= bvhdata_size)
      return 0L;
    first_motion_line = i;
    next = first_motion_line;
  }
  *data = &bvhdata[next];
  for (i = next; i < bvhdata_size; i++) {
    if ((bvhdata[i] == '\n') || (bvhdata[i] == '\r'))
      break;
  }
  length = (i - next) + 1;
  for (; i < bvhdata_size; i++) {
    if ((bvhdata[i] == '-') || ((bvhdata[i] >= '0') && (bvhdata[i] <= '9')))
      break;
  }
  if (i >= bvhdata_size)
    next = first_motion_line;
  else
    next = i;
  return length;
}


x86 assembly (clang, -O0):
<read_next_motion_line>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movq   $0x0,-0x30(%rbp)
xor    %eax,%eax
cmp    0x2f07(%rip),%rax
jne    1333 <read_next_motion_line+0x233>
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0xa,%rcx
cmp    %rcx,%rax
jae    123a <read_next_motion_line+0x13a>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x46,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x1(%rax,%rcx,1),%eax
cmp    $0x72,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x2(%rax,%rcx,1),%eax
cmp    $0x61,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x3(%rax,%rcx,1),%eax
cmp    $0x6d,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x4(%rax,%rcx,1),%eax
cmp    $0x65,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x5(%rax,%rcx,1),%eax
cmp    $0x20,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x6(%rax,%rcx,1),%eax
cmp    $0x54,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x7(%rax,%rcx,1),%eax
cmp    $0x69,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x8(%rax,%rcx,1),%eax
cmp    $0x6d,%eax
jne    1224 <read_next_motion_line+0x124>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl 0x9(%rax,%rcx,1),%eax
cmp    $0x65,%eax
jne    1224 <read_next_motion_line+0x124>
jmp    123a <read_next_motion_line+0x13a>
jmp    1229 <read_next_motion_line+0x129>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    112f <read_next_motion_line+0x2f>
jmp    123f <read_next_motion_line+0x13f>
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    1292 <read_next_motion_line+0x192>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xa,%eax
je     1277 <read_next_motion_line+0x177>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xd,%eax
jne    127c <read_next_motion_line+0x17c>
jmp    1292 <read_next_motion_line+0x192>
jmp    1281 <read_next_motion_line+0x181>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    123f <read_next_motion_line+0x13f>
jmp    1297 <read_next_motion_line+0x197>
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    12ff <read_next_motion_line+0x1ff>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
je     12e4 <read_next_motion_line+0x1e4>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     12e9 <read_next_motion_line+0x1e9>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     12e9 <read_next_motion_line+0x1e9>
jmp    12ff <read_next_motion_line+0x1ff>
jmp    12ee <read_next_motion_line+0x1ee>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1297 <read_next_motion_line+0x197>
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jb     131a <read_next_motion_line+0x21a>
movq   $0x0,-0x8(%rbp)
jmp    1452 <read_next_motion_line+0x352>
mov    -0x28(%rbp),%rax
mov    %rax,0x2d03(%rip)
mov    0x2cfc(%rip),%rax
mov    %rax,0x2cfd(%rip)
mov    -0x10(%rbp),%rcx
add    0x2cf2(%rip),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
mov    0x2ce4(%rip),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    13a3 <read_next_motion_line+0x2a3>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xa,%eax
je     1388 <read_next_motion_line+0x288>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xd,%eax
jne    138d <read_next_motion_line+0x28d>
jmp    13a3 <read_next_motion_line+0x2a3>
jmp    1392 <read_next_motion_line+0x292>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1350 <read_next_motion_line+0x250>
mov    -0x28(%rbp),%rax
sub    0x2c82(%rip),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    141e <read_next_motion_line+0x31e>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
je     1403 <read_next_motion_line+0x303>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1408 <read_next_motion_line+0x308>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     1408 <read_next_motion_line+0x308>
jmp    141e <read_next_motion_line+0x31e>
jmp    140d <read_next_motion_line+0x30d>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13b6 <read_next_motion_line+0x2b6>
mov    -0x28(%rbp),%rax
cmp    -0x18(%rbp),%rax
jb     143f <read_next_motion_line+0x33f>
mov    0x2bf5(%rip),%rax
mov    %rax,0x2bf6(%rip)
jmp    144a <read_next_motion_line+0x34a>
mov    -0x28(%rbp),%rax
mov    %rax,0x2be6(%rip)
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<read_next_motion_line>:
mov    0x2f21(%rip),%r9
test   %r9,%r9
je     11bb <read_next_motion_line+0xbb>
mov    0x2f19(%rip),%r8
lea    (%rdi,%r8,1),%rax
mov    %rax,(%rdx)
mov    %r8,%rdx
cmp    %rsi,%r8
jae    1157 <read_next_motion_line+0x57>
mov    %r8,%rdx
nopl   0x0(%rax)
movzbl (%rdi,%rdx,1),%eax
cmp    $0xa,%al
je     1157 <read_next_motion_line+0x57>
cmp    $0xd,%al
je     1157 <read_next_motion_line+0x57>
add    $0x1,%rdx
cmp    %rdx,%rsi
jne    1130 <read_next_motion_line+0x30>
sub    %r8,%rsi
add    $0x1,%rsi
mov    %rsi,%rax
mov    %r9,0x2eda(%rip)
ret
mov    %rdx,%rax
sub    %r8,%rax
add    $0x1,%rax
cmp    %rsi,%rdx
jae    128f <read_next_motion_line+0x18f>
mov    (%rdi,%rdx,1),%cl
cmp    $0x2d,%cl
je     128c <read_next_motion_line+0x18c>
add    $0xd0,%cl
cmp    $0xa,%cl
jb     1297 <read_next_motion_line+0x197>
add    $0x1,%rdx
cs nopw 0x0(%rax,%rax,1)
mov    %rdx,%r8
cmp    %rdx,%rsi
je     12a2 <read_next_motion_line+0x1a2>
movzbl (%rdi,%r8,1),%ecx
lea    0x1(%r8),%rdx
cmp    $0x2d,%cl
je     11b2 <read_next_motion_line+0xb2>
add    $0xd0,%cl
cmp    $0xa,%cl
jae    1190 <read_next_motion_line+0x90>
add    $0xffffffffffffffff,%rdx
jmp    12a5 <read_next_motion_line+0x1a5>
mov    %rsi,%rax
xor    %r9d,%r9d
add    $0xfffffffffffffff6,%rax
jne    11d9 <read_next_motion_line+0xd9>
jmp    122d <read_next_motion_line+0x12d>
nopl   0x0(%rax)
add    $0x1,%r9
cmp    %r9,%rax
je     122a <read_next_motion_line+0x12a>
cmpb   $0x46,(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x72,0x1(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x61,0x2(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x6d,0x3(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x65,0x4(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x20,0x5(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x54,0x6(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x69,0x7(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x6d,0x8(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
cmpb   $0x65,0x9(%rdi,%r9,1)
jne    11d0 <read_next_motion_line+0xd0>
jmp    122d <read_next_motion_line+0x12d>
mov    %rax,%r9
cmp    %rsi,%r9
jae    1259 <read_next_motion_line+0x159>
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%rdi,%r9,1),%ecx
cmp    $0xa,%cl
je     1259 <read_next_motion_line+0x159>
cmp    $0xd,%cl
je     1259 <read_next_motion_line+0x159>
add    $0x1,%r9
cmp    %r9,%rsi
jne    1240 <read_next_motion_line+0x140>
ret
xor    %eax,%eax
cmp    %rsi,%r9
jae    1258 <read_next_motion_line+0x158>
movzbl (%rdi,%r9,1),%ecx
cmp    $0x2d,%cl
je     127d <read_next_motion_line+0x17d>
add    $0xd0,%cl
cmp    $0xa,%cl
jb     127d <read_next_motion_line+0x17d>
add    $0x1,%r9
cmp    %r9,%rsi
jne    1260 <read_next_motion_line+0x160>
jmp    1258 <read_next_motion_line+0x158>
mov    %r9,0x2da4(%rip)
mov    %r9,%r8
jmp    1117 <read_next_motion_line+0x17>
mov    %rdx,%r9
mov    %r9,0x2d9a(%rip)
ret
mov    %rdx,%r9
mov    %r9,0x2d8f(%rip)
ret
mov    %rsi,%rdx
cmp    %rsi,%r8
cmovb  %rdx,%r9
mov    %r9,0x2d7d(%rip)
ret

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

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