int split(string, fields, nfields, sep)
char *string;
char *fields[];
int nfields;
char *sep;
{
  register char *p = string;
  register char c;
  register char sepc = sep[0];
  register char sepc2;
  register int fn;
  register char **fp = fields;
  register char *sepp;
  register int trimtrail;
  if (sepc == '\0') {
    while ((c = *p++) == ' ' || c == '\t')
      continue;
    p--;
    trimtrail = 1;
    sep = (char *)" \t";
    sepc = ' ';
  } else
    trimtrail = 0;
  sepc2 = sep[1];
  if (*p == '\0')
    return (0);
  if (sepc2 == '\0') {
    fn = nfields;
    for (;;) {
      *fp++ = p;
      fn--;
      if (fn == 0)
        break;
      while ((c = *p++) != sepc)
        if (c == '\0')
          return (nfields - fn);
      *(p - 1) = '\0';
    }
    fn = nfields;
    for (;;) {
      while ((c = *p++) != sepc)
        if (c == '\0')
          return (fn);
      fn++;
    }
  }
  if (sep[2] == '\0') {
    fn = nfields;
    for (;;) {
      *fp++ = p;
      fn--;
      while ((c = *p++) != sepc && c != sepc2)
        if (c == '\0') {
          if (trimtrail && **(fp - 1) == '\0')
            fn++;
          return (nfields - fn);
        }
      if (fn == 0)
        break;
      *(p - 1) = '\0';
      while ((c = *p++) == sepc || c == sepc2)
        continue;
      p--;
    }
    fn = nfields;
    while (c != '\0') {
      while ((c = *p++) == sepc || c == sepc2)
        continue;
      p--;
      fn++;
      while ((c = *p++) != '\0' && c != sepc && c != sepc2)
        continue;
    }
    if (trimtrail) {
      p--;
      while ((c = *--p) == sepc || c == sepc2)
        continue;
      p++;
      if (*p != '\0') {
        if (fn == nfields + 1)
          *p = '\0';
        fn--;
      }
    }
    return (fn);
  }
  fn = 0;
  for (;;) {
    if (fn < nfields)
      *fp++ = p;
    fn++;
    for (;;) {
      c = *p++;
      if (c == '\0')
        return (fn);
      sepp = sep;
      while ((sepc = *sepp++) != '\0' && sepc != c)
        continue;
      if (sepc != '\0')
        break;
    }
    if (fn < nfields)
      *(p - 1) = '\0';
    for (;;) {
      c = *p++;
      sepp = sep;
      while ((sepc = *sepp++) != '\0' && sepc != c)
        continue;
      if (sepc == '\0')
        break;
    }
    p--;
  }
}


x86 assembly (clang, -O0):
<split>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %rcx,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x32(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
movsbl -0x32(%rbp),%eax
cmp    $0x0,%eax
jne    11ac <split+0xac>
jmp    113e <split+0x3e>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x4d(%rbp)
je     1170 <split+0x70>
movsbl -0x31(%rbp),%eax
cmp    $0x9,%eax
sete   %al
mov    %al,-0x4d(%rbp)
mov    -0x4d(%rbp),%al
test   $0x1,%al
jne    1180 <split+0x80>
jmp    1185 <split+0x85>
jmp    113e <split+0x3e>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
movl   $0x1,-0x4c(%rbp)
lea    0xe61(%rip),%rax
mov    %rax,-0x28(%rbp)
movb   $0x20,-0x32(%rbp)
jmp    11b3 <split+0xb3>
movl   $0x0,-0x4c(%rbp)
mov    -0x28(%rbp),%rax
mov    0x1(%rax),%al
mov    %al,-0x33(%rbp)
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11d9 <split+0xd9>
movl   $0x0,-0x4(%rbp)
jmp    16ff <split+0x5ff>
movsbl -0x33(%rbp),%eax
cmp    $0x0,%eax
jne    12c8 <split+0x1c8>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%rcx
mov    -0x40(%rbp),%rax
mov    %rax,%rdx
add    $0x8,%rdx
mov    %rdx,-0x40(%rbp)
mov    %rcx,(%rax)
mov    -0x38(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x38(%rbp)
cmpl   $0x0,-0x38(%rbp)
jne    121a <split+0x11a>
jmp    126f <split+0x16f>
jmp    121f <split+0x11f>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%eax
movsbl -0x32(%rbp),%ecx
cmp    %ecx,%eax
je     1262 <split+0x162>
movsbl -0x31(%rbp),%eax
cmp    $0x0,%eax
jne    125d <split+0x15d>
mov    -0x1c(%rbp),%eax
sub    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    16ff <split+0x5ff>
jmp    121f <split+0x11f>
mov    -0x30(%rbp),%rax
movb   $0x0,-0x1(%rax)
jmp    11ec <split+0xec>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x38(%rbp)
jmp    127a <split+0x17a>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%eax
movsbl -0x32(%rbp),%ecx
cmp    %ecx,%eax
je     12ba <split+0x1ba>
movsbl -0x31(%rbp),%eax
cmp    $0x0,%eax
jne    12b5 <split+0x1b5>
mov    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    16ff <split+0x5ff>
jmp    127a <split+0x17a>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1275 <split+0x175>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
jne    1591 <split+0x491>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%rcx
mov    -0x40(%rbp),%rax
mov    %rax,%rdx
add    $0x8,%rdx
mov    %rdx,-0x40(%rbp)
mov    %rcx,(%rax)
mov    -0x38(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%ecx
movsbl -0x32(%rbp),%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x4e(%rbp)
je     1336 <split+0x236>
movsbl -0x31(%rbp),%eax
movsbl -0x33(%rbp),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x4e(%rbp)
mov    -0x4e(%rbp),%al
test   $0x1,%al
jne    1346 <split+0x246>
jmp    138d <split+0x28d>
movsbl -0x31(%rbp),%eax
cmp    $0x0,%eax
jne    1388 <split+0x288>
cmpl   $0x0,-0x4c(%rbp)
je     137a <split+0x27a>
mov    -0x40(%rbp),%rax
mov    -0x8(%rax),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    137a <split+0x27a>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x1c(%rbp),%eax
sub    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    16ff <split+0x5ff>
jmp    12fe <split+0x1fe>
cmpl   $0x0,-0x38(%rbp)
jne    139c <split+0x29c>
jmp    1402 <split+0x302>
mov    -0x30(%rbp),%rax
movb   $0x0,-0x1(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%ecx
movsbl -0x32(%rbp),%edx
mov    $0x1,%al
cmp    %edx,%ecx
mov    %al,-0x4f(%rbp)
je     13dc <split+0x2dc>
movsbl -0x31(%rbp),%eax
movsbl -0x33(%rbp),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x4f(%rbp)
mov    -0x4f(%rbp),%al
test   $0x1,%al
jne    13ec <split+0x2ec>
jmp    13f1 <split+0x2f1>
jmp    13a4 <split+0x2a4>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
jmp    12df <split+0x1df>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x38(%rbp)
movsbl -0x31(%rbp),%eax
cmp    $0x0,%eax
je     14e0 <split+0x3e0>
jmp    141a <split+0x31a>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%ecx
movsbl -0x32(%rbp),%edx
mov    $0x1,%al
cmp    %edx,%ecx
mov    %al,-0x50(%rbp)
je     1452 <split+0x352>
movsbl -0x31(%rbp),%eax
movsbl -0x33(%rbp),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x50(%rbp)
mov    -0x50(%rbp),%al
test   $0x1,%al
jne    1462 <split+0x362>
jmp    1467 <split+0x367>
jmp    141a <split+0x31a>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x51(%rbp)
je     14c6 <split+0x3c6>
movsbl -0x31(%rbp),%ecx
movsbl -0x32(%rbp),%edx
xor    %eax,%eax
cmp    %edx,%ecx
mov    %al,-0x51(%rbp)
je     14c6 <split+0x3c6>
movsbl -0x31(%rbp),%eax
movsbl -0x33(%rbp),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    14d6 <split+0x3d6>
jmp    14db <split+0x3db>
jmp    147c <split+0x37c>
jmp    1408 <split+0x308>
cmpl   $0x0,-0x4c(%rbp)
je     1586 <split+0x486>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x30(%rbp)
mov    -0x1(%rax),%al
mov    %al,-0x31(%rbp)
movsbl %al,%ecx
movsbl -0x32(%rbp),%edx
mov    $0x1,%al
cmp    %edx,%ecx
mov    %al,-0x52(%rbp)
je     152f <split+0x42f>
movsbl -0x31(%rbp),%eax
movsbl -0x33(%rbp),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x52(%rbp)
mov    -0x52(%rbp),%al
test   $0x1,%al
jne    153f <split+0x43f>
jmp    1544 <split+0x444>
jmp    14f6 <split+0x3f6>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1581 <split+0x481>
mov    -0x38(%rbp),%eax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
cmp    %ecx,%eax
jne    1578 <split+0x478>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x38(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x38(%rbp)
jmp    1586 <split+0x486>
mov    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    16ff <split+0x5ff>
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    15ba <split+0x4ba>
mov    -0x30(%rbp),%rcx
mov    -0x40(%rbp),%rax
mov    %rax,%rdx
add    $0x8,%rdx
mov    %rdx,-0x40(%rbp)
mov    %rcx,(%rax)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
movsbl -0x31(%rbp),%eax
cmp    $0x0,%eax
jne    15ef <split+0x4ef>
mov    -0x38(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    16ff <split+0x5ff>
mov    -0x28(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
mov    (%rax),%al
mov    %al,-0x32(%rbp)
movsbl %al,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x53(%rbp)
je     162c <split+0x52c>
movsbl -0x32(%rbp),%eax
movsbl -0x31(%rbp),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x53(%rbp)
mov    -0x53(%rbp),%al
test   $0x1,%al
jne    163c <split+0x53c>
jmp    1641 <split+0x541>
jmp    15f7 <split+0x4f7>
movsbl -0x32(%rbp),%eax
cmp    $0x0,%eax
je     1653 <split+0x553>
jmp    1658 <split+0x558>
jmp    15c3 <split+0x4c3>
mov    -0x38(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    166c <split+0x56c>
mov    -0x30(%rbp),%rax
movb   $0x0,-0x1(%rax)
jmp    1671 <split+0x571>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
mov    (%rax),%al
mov    %al,-0x31(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x48(%rbp)
mov    (%rax),%al
mov    %al,-0x32(%rbp)
movsbl %al,%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x54(%rbp)
je     16c2 <split+0x5c2>
movsbl -0x32(%rbp),%eax
movsbl -0x31(%rbp),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x54(%rbp)
mov    -0x54(%rbp),%al
test   $0x1,%al
jne    16d2 <split+0x5d2>
jmp    16d7 <split+0x5d7>
jmp    168d <split+0x58d>
movsbl -0x32(%rbp),%eax
cmp    $0x0,%eax
jne    16e9 <split+0x5e9>
jmp    16ee <split+0x5ee>
jmp    1671 <split+0x571>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
jmp    1598 <split+0x498>
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<split>:
push   %rbx
movsbl (%rcx),%r9d
test   %r9d,%r9d
je     11f4 <split+0xf4>
mov    (%rdi),%al
mov    %r9d,%r8d
test   %al,%al
je     1214 <split+0x114>
mov    0x1(%rcx),%r10b
test   %r10b,%r10b
je     1218 <split+0x118>
cmpb   $0x0,0x2(%rcx)
je     1251 <split+0x151>
xor    %eax,%eax
cmp    %edx,%eax
jge    113f <split+0x3f>
mov    %rdi,(%rsi)
add    $0x8,%rsi
add    $0x1,%eax
jmp    1155 <split+0x55>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
test   %r10b,%r10b
jne    1190 <split+0x90>
mov    (%rdi),%r9b
test   %r9b,%r9b
je     1379 <split+0x279>
mov    %rdi,%r8
add    $0x1,%rdi
mov    %rcx,%rbx
nopl   0x0(%rax,%rax,1)
movzbl (%rbx),%r10d
test   %r10b,%r10b
je     1150 <split+0x50>
add    $0x1,%rbx
cmp    %r9b,%r10b
jne    1170 <split+0x70>
jmp    1150 <split+0x50>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
cmp    %edx,%eax
jge    11a8 <split+0xa8>
movb   $0x0,(%r8)
jmp    11a8 <split+0xa8>
nopw   0x0(%rax,%rax,1)
lea    0x1(%r8),%rdi
test   %bl,%bl
je     11e0 <split+0xe0>
mov    %rdi,%r8
mov    (%rdi),%r9b
mov    %rcx,%rdi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl (%rdi),%ebx
test   %bl,%bl
je     11a0 <split+0xa0>
add    $0x1,%rdi
cmp    %r9b,%bl
jne    11c0 <split+0xc0>
jmp    11a0 <split+0xa0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %r8,%rdi
cmp    %edx,%eax
jl     1138 <split+0x38>
jmp    113f <split+0x3f>
add    $0x1,%rdi
movzbl (%rdi),%eax
cmp    $0x20,%al
je     11f0 <split+0xf0>
cmp    $0x9,%al
je     11f0 <split+0xf0>
mov    $0x20,%r8d
lea    0xdf4(%rip),%rcx
test   %al,%al
jne    111b <split+0x1b>
xor    %eax,%eax
pop    %rbx
ret
mov    %rdi,(%rsi)
mov    %edx,%eax
add    $0xffffffff,%eax
je     12bd <split+0x1bd>
add    $0x8,%rsi
add    $0x1,%rdi
xchg   %ax,%ax
movsbl -0x1(%rdi),%ecx
cmp    %ecx,%r8d
je     1243 <split+0x143>
add    $0x1,%rdi
test   %cl,%cl
jne    1230 <split+0x130>
jmp    12b6 <split+0x1b6>
movb   $0x0,-0x1(%rdi)
mov    %rdi,(%rsi)
add    $0xffffffff,%eax
jne    1226 <split+0x126>
jmp    12bd <split+0x1bd>
mov    %edx,%r11d
mov    %rdi,%rcx
mov    %rdi,(%rsi)
add    $0x8,%rsi
lea    -0x1(%r11),%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsbl (%rcx),%ebx
cmp    %ebx,%r8d
je     1287 <split+0x187>
cmp    %r10b,%bl
je     1287 <split+0x187>
add    $0x1,%rcx
test   %bl,%bl
jne    1270 <split+0x170>
jmp    12aa <split+0x1aa>
test   %eax,%eax
je     12e5 <split+0x1e5>
movb   $0x0,(%rcx)
xchg   %ax,%ax
movsbl 0x1(%rcx),%edi
add    $0x1,%rcx
cmp    %edi,%r8d
je     1290 <split+0x190>
cmp    %r10b,%dil
je     1290 <split+0x190>
mov    %rcx,%rdi
mov    %eax,%r11d
jmp    1257 <split+0x157>
test   %r9b,%r9b
jne    12b6 <split+0x1b6>
cmpb   $0x0,(%rdi)
cmove  %r11d,%eax
sub    %eax,%edx
jmp    12e1 <split+0x1e1>
add    $0x1,%edx
add    $0x1,%rdi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsbl -0x1(%rdi),%eax
cmp    %eax,%r8d
je     12ba <split+0x1ba>
add    $0x1,%rdi
test   %al,%al
jne    12d0 <split+0x1d0>
mov    %edx,%eax
pop    %rbx
ret
test   %bl,%bl
je     134a <split+0x24a>
add    $0x1,%rcx
mov    %edx,%eax
mov    %rcx,%rsi
jmp    1300 <split+0x200>
lea    -0x1(%rsi),%rcx
add    $0x1,%eax
test   %bl,%bl
jne    134c <split+0x24c>
nop
mov    (%rsi),%bl
add    $0x1,%rsi
movsbl %bl,%edi
cmp    %edi,%r8d
je     1300 <split+0x200>
cmp    %r10b,%bl
je     1300 <split+0x200>
lea    -0x1(%rsi),%rcx
test   %bl,%bl
sete   %bl
je     12f8 <split+0x1f8>
cmp    %edi,%r8d
je     12f8 <split+0x1f8>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movsbl (%rsi),%ecx
add    $0x1,%rsi
test   %ecx,%ecx
sete   %bl
je     12f4 <split+0x1f4>
cmp    %ecx,%r8d
je     12f4 <split+0x1f4>
cmp    %r10b,%cl
jne    1330 <split+0x230>
jmp    12f4 <split+0x1f4>
mov    %edx,%eax
test   %r9b,%r9b
jne    1379 <split+0x279>
add    $0x1,%rcx
movsbl -0x2(%rcx),%esi
add    $0xffffffffffffffff,%rcx
cmp    %esi,%r8d
je     1355 <split+0x255>
cmp    %r10b,%sil
je     1355 <split+0x255>
cmpb   $0x0,(%rcx)
je     1379 <split+0x279>
add    $0x1,%edx
cmp    %edx,%eax
jne    1376 <split+0x276>
movb   $0x0,(%rcx)
add    $0xffffffff,%eax
pop    %rbx
ret

LLVM IR (-O0):
@.str = [3 x i8] c" \09\00"
define i32 @split(i8* %0, i8** %1, i32 %2, i8* %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i8**
%8 = alloca i32
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i8
%12 = alloca i8
%13 = alloca i8
%14 = alloca i32
%15 = alloca i8**
%16 = alloca i8*
%17 = alloca i32
store i8* %0, i8** %6
store i8** %1, i8*** %7
store i32 %2, i32* %8
store i8* %3, i8** %9
%18 = load i8*, i8** %6
store i8* %18, i8** %10
%19 = load i8*, i8** %9
%20 = getelementptr inbounds i8, i8* %19, i64 0
%21 = load i8, i8* %20
store i8 %21, i8* %12
%22 = load i8**, i8*** %7
store i8** %22, i8*** %15
%23 = load i8, i8* %12
%24 = sext i8 %23 to i32
%25 = icmp eq i32 %24, 0
br i1 %25, label %26, label %43
26: ; preds = %4
br label %27
27: ; preds = %39, %26
%28 = load i8*, i8** %10
%29 = getelementptr inbounds i8, i8* %28, i32 1
store i8* %29, i8** %10
%30 = load i8, i8* %28
store i8 %30, i8* %11
%31 = sext i8 %30 to i32
%32 = icmp eq i32 %31, 32
br i1 %32, label %37, label %33
33: ; preds = %27
%34 = load i8, i8* %11
%35 = sext i8 %34 to i32
%36 = icmp eq i32 %35, 9
br label %37
37: ; preds = %33, %27
%38 = phi i1 [ true, %27 ], [ %36, %33 ]
br i1 %38, label %39, label %40
39: ; preds = %37
br label %27
40: ; preds = %37
%41 = load i8*, i8** %10
%42 = getelementptr inbounds i8, i8* %41, i32 -1
store i8* %42, i8** %10
store i32 1, i32* %17
store i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8** %9
store i8 32, i8* %12
br label %44
43: ; preds = %4
store i32 0, i32* %17
br label %44
44: ; preds = %43, %40
%45 = load i8*, i8** %9
%46 = getelementptr inbounds i8, i8* %45, i64 1
%47 = load i8, i8* %46
store i8 %47, i8* %13
%48 = load i8*, i8** %10
%49 = load i8, i8* %48
%50 = sext i8 %49 to i32
%51 = icmp eq i32 %50, 0
br i1 %51, label %52, label %53
52: ; preds = %44
store i32 0, i32* %5
br label %364
53: ; preds = %44
%54 = load i8, i8* %13
%55 = sext i8 %54 to i32
%56 = icmp eq i32 %55, 0
br i1 %56, label %57, label %110
57: ; preds = %53
%58 = load i32, i32* %8
store i32 %58, i32* %14
br label %59
59: ; preds = %86, %57
%60 = load i8*, i8** %10
%61 = load i8**, i8*** %15
%62 = getelementptr inbounds i8*, i8** %61, i32 1
store i8** %62, i8*** %15
store i8* %60, i8** %61
%63 = load i32, i32* %14
%64 = add nsw i32 %63, -1
store i32 %64, i32* %14
%65 = load i32, i32* %14
%66 = icmp eq i32 %65, 0
br i1 %66, label %67, label %68
67: ; preds = %59
br label %89
68: ; preds = %59
br label %69
69: ; preds = %85, %68
%70 = load i8*, i8** %10
%71 = getelementptr inbounds i8, i8* %70, i32 1
store i8* %71, i8** %10
%72 = load i8, i8* %70
store i8 %72, i8* %11
%73 = sext i8 %72 to i32
%74 = load i8, i8* %12
%75 = sext i8 %74 to i32
%76 = icmp ne i32 %73, %75
br i1 %76, label %77, label %86
77: ; preds = %69
%78 = load i8, i8* %11
%79 = sext i8 %78 to i32
%80 = icmp eq i32 %79, 0
br i1 %80, label %81, label %85
81: ; preds = %77
%82 = load i32, i32* %8
%83 = load i32, i32* %14
%84 = sub nsw i32 %82, %83
store i32 %84, i32* %5
br label %364
85: ; preds = %77
br label %69
86: ; preds = %69
%87 = load i8*, i8** %10
%88 = getelementptr inbounds i8, i8* %87, i64 -1
store i8 0, i8* %88
br label %59
89: ; preds = %67
%90 = load i32, i32* %8
store i32 %90, i32* %14
br label %91
91: ; preds = %107, %89
br label %92
92: ; preds = %106, %91
%93 = load i8*, i8** %10
%94 = getelementptr inbounds i8, i8* %93, i32 1
store i8* %94, i8** %10
%95 = load i8, i8* %93
store i8 %95, i8* %11
%96 = sext i8 %95 to i32
%97 = load i8, i8* %12
%98 = sext i8 %97 to i32
%99 = icmp ne i32 %96, %98
br i1 %99, label %100, label %107
100: ; preds = %92
%101 = load i8, i8* %11
%102 = sext i8 %101 to i32
%103 = icmp eq i32 %102, 0
br i1 %103, label %104, label %106
104: ; preds = %100
%105 = load i32, i32* %14
store i32 %105, i32* %5
br label %364
106: ; preds = %100
br label %92
107: ; preds = %92
%108 = load i32, i32* %14
%109 = add nsw i32 %108, 1
store i32 %109, i32* %14
br label %91
110: ; preds = %53
%111 = load i8*, i8** %9
%112 = getelementptr inbounds i8, i8* %111, i64 2
%113 = load i8, i8* %112
%114 = sext i8 %113 to i32
%115 = icmp eq i32 %114, 0
br i1 %115, label %116, label %283
116: ; preds = %110
%117 = load i32, i32* %8
store i32 %117, i32* %14
br label %118
118: ; preds = %186, %116
%119 = load i8*, i8** %10
%120 = load i8**, i8*** %15
%121 = getelementptr inbounds i8*, i8** %120, i32 1
store i8** %121, i8*** %15
store i8* %119, i8** %120
%122 = load i32, i32* %14
%123 = add nsw i32 %122, -1
store i32 %123, i32* %14
br label %124
124: ; preds = %161, %118
%125 = load i8*, i8** %10
%126 = getelementptr inbounds i8, i8* %125, i32 1
store i8* %126, i8** %10
%127 = load i8, i8* %125
store i8 %127, i8* %11
%128 = sext i8 %127 to i32
%129 = load i8, i8* %12
%130 = sext i8 %129 to i32
%131 = icmp ne i32 %128, %130
br i1 %131, label %132, label %138
132: ; preds = %124
%133 = load i8, i8* %11
%134 = sext i8 %133 to i32
%135 = load i8, i8* %13
%136 = sext i8 %135 to i32
%137 = icmp ne i32 %134, %136
br label %138
138: ; preds = %132, %124
%139 = phi i1 [ false, %124 ], [ %137, %132 ]
br i1 %139, label %140, label %162
140: ; preds = %138
%141 = load i8, i8* %11
%142 = sext i8 %141 to i32
%143 = icmp eq i32 %142, 0
br i1 %143, label %144, label %161
144: ; preds = %140
%145 = load i32, i32* %17
%146 = icmp ne i32 %145, 0
br i1 %146, label %147, label %157
147: ; preds = %144
%148 = load i8**, i8*** %15
%149 = getelementptr inbounds i8*, i8** %148, i64 -1
%150 = load i8*, i8** %149
%151 = load i8, i8* %150
%152 = sext i8 %151 to i32
%153 = icmp eq i32 %152, 0
br i1 %153, label %154, label %157
154: ; preds = %147
%155 = load i32, i32* %14
%156 = add nsw i32 %155, 1
store i32 %156, i32* %14
br label %157
157: ; preds = %154, %147, %144
%158 = load i32, i32* %8
%159 = load i32, i32* %14
%160 = sub nsw i32 %158, %159
store i32 %160, i32* %5
br label %364
161: ; preds = %140
br label %124
162: ; preds = %138
%163 = load i32, i32* %14
%164 = icmp eq i32 %163, 0
br i1 %164, label %165, label %166
165: ; preds = %162
br label %189
166: ; preds = %162
%167 = load i8*, i8** %10
%168 = getelementptr inbounds i8, i8* %167, i64 -1
store i8 0, i8* %168
br label %169
169: ; preds = %185, %166
%170 = load i8*, i8** %10
%171 = getelementptr inbounds i8, i8* %170, i32 1
store i8* %171, i8** %10
%172 = load i8, i8* %170
store i8 %172, i8* %11
%173 = sext i8 %172 to i32
%174 = load i8, i8* %12
%175 = sext i8 %174 to i32
%176 = icmp eq i32 %173, %175
br i1 %176, label %183, label %177
177: ; preds = %169
%178 = load i8, i8* %11
%179 = sext i8 %178 to i32
%180 = load i8, i8* %13
%181 = sext i8 %180 to i32
%182 = icmp eq i32 %179, %181
br label %183
183: ; preds = %177, %169
%184 = phi i1 [ true, %169 ], [ %182, %177 ]
br i1 %184, label %185, label %186
185: ; preds = %183
br label %169
186: ; preds = %183
%187 = load i8*, i8** %10
%188 = getelementptr inbounds i8, i8* %187, i32 -1
store i8* %188, i8** %10
br label %118
189: ; preds = %165
%190 = load i32, i32* %8
store i32 %190, i32* %14
br label %191
191: ; preds = %239, %189
%192 = load i8, i8* %11
%193 = sext i8 %192 to i32
%194 = icmp ne i32 %193, 0
br i1 %194, label %195, label %240
195: ; preds = %191
br label %196
196: ; preds = %212, %195
%197 = load i8*, i8** %10
%198 = getelementptr inbounds i8, i8* %197, i32 1
store i8* %198, i8** %10
%199 = load i8, i8* %197
store i8 %199, i8* %11
%200 = sext i8 %199 to i32
%201 = load i8, i8* %12
%202 = sext i8 %201 to i32
%203 = icmp eq i32 %200, %202
br i1 %203, label %210, label %204
204: ; preds = %196
%205 = load i8, i8* %11
%206 = sext i8 %205 to i32
%207 = load i8, i8* %13
%208 = sext i8 %207 to i32
%209 = icmp eq i32 %206, %208
br label %210
210: ; preds = %204, %196
%211 = phi i1 [ true, %196 ], [ %209, %204 ]
br i1 %211, label %212, label %213
212: ; preds = %210
br label %196
213: ; preds = %210
%214 = load i8*, i8** %10
%215 = getelementptr inbounds i8, i8* %214, i32 -1
store i8* %215, i8** %10
%216 = load i32, i32* %14
%217 = add nsw i32 %216, 1
store i32 %217, i32* %14
br label %218
218: ; preds = %238, %213
%219 = load i8*, i8** %10
%220 = getelementptr inbounds i8, i8* %219, i32 1
store i8* %220, i8** %10
%221 = load i8, i8* %219
store i8 %221, i8* %11
%222 = sext i8 %221 to i32
%223 = icmp ne i32 %222, 0
br i1 %223, label %224, label %236
224: ; preds = %218
%225 = load i8, i8* %11
%226 = sext i8 %225 to i32
%227 = load i8, i8* %12
%228 = sext i8 %227 to i32
%229 = icmp ne i32 %226, %228
br i1 %229, label %230, label %236
230: ; preds = %224
%231 = load i8, i8* %11
%232 = sext i8 %231 to i32
%233 = load i8, i8* %13
%234 = sext i8 %233 to i32
%235 = icmp ne i32 %232, %234
br label %236
236: ; preds = %230, %224, %218
%237 = phi i1 [ false, %224 ], [ false, %218 ], [ %235, %230 ]
br i1 %237, label %238, label %239
238: ; preds = %236
br label %218
239: ; preds = %236
br label %191
240: ; preds = %191
%241 = load i32, i32* %17
%242 = icmp ne i32 %241, 0
br i1 %242, label %243, label %281
243: ; preds = %240
%244 = load i8*, i8** %10
%245 = getelementptr inbounds i8, i8* %244, i32 -1
store i8* %245, i8** %10
br label %246
246: ; preds = %262, %243
%247 = load i8*, i8** %10
%248 = getelementptr inbounds i8, i8* %247, i32 -1
store i8* %248, i8** %10
%249 = load i8, i8* %248
store i8 %249, i8* %11
%250 = sext i8 %249 to i32
%251 = load i8, i8* %12
%252 = sext i8 %251 to i32
%253 = icmp eq i32 %250, %252
br i1 %253, label %260, label %254
254: ; preds = %246
%255 = load i8, i8* %11
%256 = sext i8 %255 to i32
%257 = load i8, i8* %13
%258 = sext i8 %257 to i32
%259 = icmp eq i32 %256, %258
br label %260
260: ; preds = %254, %246
%261 = phi i1 [ true, %246 ], [ %259, %254 ]
br i1 %261, label %262, label %263
262: ; preds = %260
br label %246
263: ; preds = %260
%264 = load i8*, i8** %10
%265 = getelementptr inbounds i8, i8* %264, i32 1
store i8* %265, i8** %10
%266 = load i8*, i8** %10
%267 = load i8, i8* %266
%268 = sext i8 %267 to i32
%269 = icmp ne i32 %268, 0
br i1 %269, label %270, label %280
270: ; preds = %263
%271 = load i32, i32* %14
%272 = load i32, i32* %8
%273 = add nsw i32 %272, 1
%274 = icmp eq i32 %271, %273
br i1 %274, label %275, label %277
275: ; preds = %270
%276 = load i8*, i8** %10
store i8 0, i8* %276
br label %277
277: ; preds = %275, %270
%278 = load i32, i32* %14
%279 = add nsw i32 %278, -1
store i32 %279, i32* %14
br label %280
280: ; preds = %277, %263
br label %281
281: ; preds = %280, %240
%282 = load i32, i32* %14
store i32 %282, i32* %5
br label %364
283: ; preds = %110
store i32 0, i32* %14
br label %284
284: ; preds = %361, %283
%285 = load i32, i32* %14
%286 = load i32, i32* %8
%287 = icmp slt i32 %285, %286
br i1 %287, label %288, label %292
288: ; preds = %284
%289 = load i8*, i8** %10
%290 = load i8**, i8*** %15
%291 = getelementptr inbounds i8*, i8** %290, i32 1
store i8** %291, i8*** %15
store i8* %289, i8** %290
br label %292
292: ; preds = %288, %284
%293 = load i32, i32* %14
%294 = add nsw i32 %293, 1
store i32 %294, i32* %14
br label %295
295: ; preds = %326, %292
%296 = load i8*, i8** %10
%297 = getelementptr inbounds i8, i8* %296, i32 1
store i8* %297, i8** %10
%298 = load i8, i8* %296
store i8 %298, i8* %11
%299 = load i8, i8* %11
%300 = sext i8 %299 to i32
%301 = icmp eq i32 %300, 0
br i1 %301, label %302, label %304
302: ; preds = %295
%303 = load i32, i32* %14
store i32 %303, i32* %5
br label %364
304: ; preds = %295
%305 = load i8*, i8** %9
store i8* %305, i8** %16
br label %306
306: ; preds = %320, %304
%307 = load i8*, i8** %16
%308 = getelementptr inbounds i8, i8* %307, i32 1
store i8* %308, i8** %16
%309 = load i8, i8* %307
store i8 %309, i8* %12
%310 = sext i8 %309 to i32
%311 = icmp ne i32 %310, 0
br i1 %311, label %312, label %318
312: ; preds = %306
%313 = load i8, i8* %12
%314 = sext i8 %313 to i32
%315 = load i8, i8* %11
%316 = sext i8 %315 to i32
%317 = icmp ne i32 %314, %316
br label %318
318: ; preds = %312, %306
%319 = phi i1 [ false, %306 ], [ %317, %312 ]
br i1 %319, label %320, label %321
320: ; preds = %318
br label %306
321: ; preds = %318
%322 = load i8, i8* %12
%323 = sext i8 %322 to i32
%324 = icmp ne i32 %323, 0
br i1 %324, label %325, label %326
325: ; preds = %321
br label %327
326: ; preds = %321
br label %295
327: ; preds = %325
%328 = load i32, i32* %14
%329 = load i32, i32* %8
%330 = icmp slt i32 %328, %329
br i1 %330, label %331, label %334
331: ; preds = %327
%332 = load i8*, i8** %10
%333 = getelementptr inbounds i8, i8* %332, i64 -1
store i8 0, i8* %333
br label %334
334: ; preds = %331, %327
br label %335
335: ; preds = %360, %334
%336 = load i8*, i8** %10
%337 = getelementptr inbounds i8, i8* %336, i32 1
store i8* %337, i8** %10
%338 = load i8, i8* %336
store i8 %338, i8* %11
%339 = load i8*, i8** %9
store i8* %339, i8** %16
br label %340
340: ; preds = %354, %335
%341 = load i8*, i8** %16
%342 = getelementptr inbounds i8, i8* %341, i32 1
store i8* %342, i8** %16
%343 = load i8, i8* %341
store i8 %343, i8* %12
%344 = sext i8 %343 to i32
%345 = icmp ne i32 %344, 0
br i1 %345, label %346, label %352
346: ; preds = %340
%347 = load i8, i8* %12
%348 = sext i8 %347 to i32
%349 = load i8, i8* %11
%350 = sext i8 %349 to i32
%351 = icmp ne i32 %348, %350
br label %352
352: ; preds = %346, %340
%353 = phi i1 [ false, %340 ], [ %351, %346 ]
br i1 %353, label %354, label %355
354: ; preds = %352
br label %340
355: ; preds = %352
%356 = load i8, i8* %12
%357 = sext i8 %356 to i32
%358 = icmp eq i32 %357, 0
br i1 %358, label %359, label %360
359: ; preds = %355
br label %361
360: ; preds = %355
br label %335
361: ; preds = %359
%362 = load i8*, i8** %10
%363 = getelementptr inbounds i8, i8* %362, i32 -1
store i8* %363, i8** %10
br label %284
364: ; preds = %302, %281, %157, %104, %81, %52
%365 = load i32, i32* %5
ret i32 %365
}

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