int watershed(int *in, unsigned char *out, int *dup, int w, int h, int *markx,
              int *marky, int nmark) {
  int i;
  int bx, by, bm;
  int bidx;
  int newb;
  int nbcount;
  int thresh;
  int curnq;
  int iteration;
  int bqx[100000];
  int bqy[100000];
  int bqm[100000];
  int qfirst, qlast;
  int nq;
  qfirst = 0;
  qlast = 0;
  nq = 0;
  for (i = 0; i < w * h; i++)
    out[i] = 0;
  for (i = 0; i < w * h; i++)
    dup[i] = -1;
  for (i = 0; i < nmark; i++) {
    if (markx[i] < 0)
      return 1;
    if (marky[i] < 0)
      return 1;
    if (markx[i] >= w)
      return 2;
    if (marky[i] >= h)
      return 2;
    {
      bqx[qlast] = markx[i];
      bqy[qlast] = marky[i];
      bqm[qlast] = i + 1;
      qlast++;
      nq++;
      {
        if (qlast >= 100000)
          qlast -= 100000;
        if ((nq >= 100000) || (nq < 0))
          return 3;
      };
    };
  }
  iteration = 0;
  for (thresh = 0; thresh < 256; iteration++) {
    newb = 0;
    curnq = nq;
    for (i = 0; i < curnq; i++) {
      {
        bx = bqx[qfirst];
        by = bqy[qfirst];
        bm = bqm[qfirst];
        qfirst++;
        nq--;
        {
          if (qfirst >= 100000)
            qfirst -= 100000;
          if ((nq >= 100000) || (nq < 0))
            return 3;
        };
      };
      bidx = by * w + bx;
      if (dup[bidx] == iteration)
        continue;
      dup[bidx] = iteration;
      if (in[bidx] > thresh) {
        {
          bqx[qlast] = bx;
          bqy[qlast] = by;
          bqm[qlast] = bm;
          qlast++;
          nq++;
          {
            if (qlast >= 100000)
              qlast -= 100000;
            if ((nq >= 100000) || (nq < 0))
              return 3;
          };
        };
        continue;
      }
      out[bidx] = bm;
      newb = 1;
      if (bx >= 1)
        if (!out[bidx - 1]) {
          {
            bqx[qlast] = bx - 1;
            bqy[qlast] = by;
            bqm[qlast] = bm;
            qlast++;
            nq++;
            {
              if (qlast >= 100000)
                qlast -= 100000;
              if ((nq >= 100000) || (nq < 0))
                return 3;
            };
          };
          nbcount++;
        }
      if (bx <= w - 2)
        if (!out[bidx + 1]) {
          {
            bqx[qlast] = bx + 1;
            bqy[qlast] = by;
            bqm[qlast] = bm;
            qlast++;
            nq++;
            {
              if (qlast >= 100000)
                qlast -= 100000;
              if ((nq >= 100000) || (nq < 0))
                return 3;
            };
          };
          nbcount++;
        }
      if (by >= 1)
        if (!out[bidx - w]) {
          {
            bqx[qlast] = bx;
            bqy[qlast] = by - 1;
            bqm[qlast] = bm;
            qlast++;
            nq++;
            {
              if (qlast >= 100000)
                qlast -= 100000;
              if ((nq >= 100000) || (nq < 0))
                return 3;
            };
          };
          nbcount++;
        }
      if (by <= h - 2)
        if (!out[bidx + w]) {
          {
            bqx[qlast] = bx;
            bqy[qlast] = by + 1;
            bqm[qlast] = bm;
            qlast++;
            nq++;
            {
              if (qlast >= 100000)
                qlast -= 100000;
              if ((nq >= 100000) || (nq < 0))
                return 3;
            };
          };
          nbcount++;
        }
    }
    if (!newb)
      thresh++;
  }
  return 0;
}


x86 assembly (clang, -O0):
<watershed>:
push   %rbp
mov    %rsp,%rbp
sub    $0x124f70,%rsp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8d,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movl   $0x0,-0x124fe4(%rbp)
movl   $0x0,-0x124fe8(%rbp)
movl   $0x0,-0x124fec(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x24(%rbp),%ecx
imul   -0x28(%rbp),%ecx
cmp    %ecx,%eax
jge    117a <watershed+0x7a>
mov    -0x18(%rbp),%rax
movslq -0x34(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    114e <watershed+0x4e>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x24(%rbp),%ecx
imul   -0x28(%rbp),%ecx
cmp    %ecx,%eax
jge    11b0 <watershed+0xb0>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movl   $0xffffffff,(%rax,%rcx,4)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1181 <watershed+0x81>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    0x18(%rbp),%eax
jge    1300 <watershed+0x200>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jge    11e1 <watershed+0xe1>
movl   $0x1,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jge    11ff <watershed+0xff>
movl   $0x1,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x24(%rbp),%eax
jl     121f <watershed+0x11f>
movl   $0x2,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x28(%rbp),%eax
jl     123f <watershed+0x13f>
movl   $0x2,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x61ae0(%rbp,%rax,4)
mov    0x10(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0xc3560(%rbp,%rax,4)
mov    -0x34(%rbp),%ecx
add    $0x1,%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x124fe0(%rbp,%rax,4)
mov    -0x124fe8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fe8(%rbp)
mov    -0x124fec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fec(%rbp)
cmpl   $0x186a0,-0x124fe8(%rbp)
jl     12c4 <watershed+0x1c4>
mov    -0x124fe8(%rbp),%eax
sub    $0x186a0,%eax
mov    %eax,-0x124fe8(%rbp)
cmpl   $0x186a0,-0x124fec(%rbp)
jge    12e1 <watershed+0x1e1>
cmpl   $0x0,-0x124fec(%rbp)
jge    12ed <watershed+0x1ed>
movl   $0x3,-0x4(%rbp)
jmp    185a <watershed+0x75a>
jmp    12f2 <watershed+0x1f2>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    11b7 <watershed+0xb7>
movl   $0x0,-0x58(%rbp)
movl   $0x0,-0x50(%rbp)
cmpl   $0x100,-0x50(%rbp)
jge    1853 <watershed+0x753>
movl   $0x0,-0x48(%rbp)
mov    -0x124fec(%rbp),%eax
mov    %eax,-0x54(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x54(%rbp),%eax
jge    182d <watershed+0x72d>
movslq -0x124fe4(%rbp),%rax
mov    -0x61ae0(%rbp,%rax,4),%eax
mov    %eax,-0x38(%rbp)
movslq -0x124fe4(%rbp),%rax
mov    -0xc3560(%rbp,%rax,4),%eax
mov    %eax,-0x3c(%rbp)
movslq -0x124fe4(%rbp),%rax
mov    -0x124fe0(%rbp,%rax,4),%eax
mov    %eax,-0x40(%rbp)
mov    -0x124fe4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fe4(%rbp)
mov    -0x124fec(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x124fec(%rbp)
cmpl   $0x186a0,-0x124fe4(%rbp)
jl     13b0 <watershed+0x2b0>
mov    -0x124fe4(%rbp),%eax
sub    $0x186a0,%eax
mov    %eax,-0x124fe4(%rbp)
cmpl   $0x186a0,-0x124fec(%rbp)
jge    13cd <watershed+0x2cd>
cmpl   $0x0,-0x124fec(%rbp)
jge    13d9 <watershed+0x2d9>
movl   $0x3,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    -0x3c(%rbp),%eax
imul   -0x24(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x58(%rbp),%eax
jne    13ff <watershed+0x2ff>
jmp    181f <watershed+0x71f>
mov    -0x58(%rbp),%edx
mov    -0x20(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x50(%rbp),%eax
jle    14c1 <watershed+0x3c1>
mov    -0x38(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x61ae0(%rbp,%rax,4)
mov    -0x3c(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0xc3560(%rbp,%rax,4)
mov    -0x40(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x124fe0(%rbp,%rax,4)
mov    -0x124fe8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fe8(%rbp)
mov    -0x124fec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fec(%rbp)
cmpl   $0x186a0,-0x124fe8(%rbp)
jl     1493 <watershed+0x393>
mov    -0x124fe8(%rbp),%eax
sub    $0x186a0,%eax
mov    %eax,-0x124fe8(%rbp)
cmpl   $0x186a0,-0x124fec(%rbp)
jge    14b0 <watershed+0x3b0>
cmpl   $0x0,-0x124fec(%rbp)
jge    14bc <watershed+0x3bc>
movl   $0x3,-0x4(%rbp)
jmp    185a <watershed+0x75a>
jmp    181f <watershed+0x71f>
mov    -0x40(%rbp),%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
movl   $0x1,-0x48(%rbp)
cmpl   $0x1,-0x38(%rbp)
jl     15a5 <watershed+0x4a5>
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    15a0 <watershed+0x4a0>
mov    -0x38(%rbp),%ecx
sub    $0x1,%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x61ae0(%rbp,%rax,4)
mov    -0x3c(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0xc3560(%rbp,%rax,4)
mov    -0x40(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x124fe0(%rbp,%rax,4)
mov    -0x124fe8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fe8(%rbp)
mov    -0x124fec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fec(%rbp)
cmpl   $0x186a0,-0x124fe8(%rbp)
jl     156e <watershed+0x46e>
mov    -0x124fe8(%rbp),%eax
sub    $0x186a0,%eax
mov    %eax,-0x124fe8(%rbp)
cmpl   $0x186a0,-0x124fec(%rbp)
jge    158b <watershed+0x48b>
cmpl   $0x0,-0x124fec(%rbp)
jge    1597 <watershed+0x497>
movl   $0x3,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    15a5 <watershed+0x4a5>
mov    -0x38(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jg     1679 <watershed+0x579>
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1674 <watershed+0x574>
mov    -0x38(%rbp),%ecx
add    $0x1,%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x61ae0(%rbp,%rax,4)
mov    -0x3c(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0xc3560(%rbp,%rax,4)
mov    -0x40(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x124fe0(%rbp,%rax,4)
mov    -0x124fe8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fe8(%rbp)
mov    -0x124fec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fec(%rbp)
cmpl   $0x186a0,-0x124fe8(%rbp)
jl     1642 <watershed+0x542>
mov    -0x124fe8(%rbp),%eax
sub    $0x186a0,%eax
mov    %eax,-0x124fe8(%rbp)
cmpl   $0x186a0,-0x124fec(%rbp)
jge    165f <watershed+0x55f>
cmpl   $0x0,-0x124fec(%rbp)
jge    166b <watershed+0x56b>
movl   $0x3,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1679 <watershed+0x579>
cmpl   $0x1,-0x3c(%rbp)
jl     1746 <watershed+0x646>
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1741 <watershed+0x641>
mov    -0x38(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x61ae0(%rbp,%rax,4)
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0xc3560(%rbp,%rax,4)
mov    -0x40(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x124fe0(%rbp,%rax,4)
mov    -0x124fe8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fe8(%rbp)
mov    -0x124fec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fec(%rbp)
cmpl   $0x186a0,-0x124fe8(%rbp)
jl     170f <watershed+0x60f>
mov    -0x124fe8(%rbp),%eax
sub    $0x186a0,%eax
mov    %eax,-0x124fe8(%rbp)
cmpl   $0x186a0,-0x124fec(%rbp)
jge    172c <watershed+0x62c>
cmpl   $0x0,-0x124fec(%rbp)
jge    1738 <watershed+0x638>
movl   $0x3,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1746 <watershed+0x646>
mov    -0x3c(%rbp),%eax
mov    -0x28(%rbp),%ecx
sub    $0x2,%ecx
cmp    %ecx,%eax
jg     181a <watershed+0x71a>
mov    -0x18(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    -0x24(%rbp),%ecx
movslq %ecx,%rcx
cmpb   $0x0,(%rax,%rcx,1)
jne    1815 <watershed+0x715>
mov    -0x38(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x61ae0(%rbp,%rax,4)
mov    -0x3c(%rbp),%ecx
add    $0x1,%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0xc3560(%rbp,%rax,4)
mov    -0x40(%rbp),%ecx
movslq -0x124fe8(%rbp),%rax
mov    %ecx,-0x124fe0(%rbp,%rax,4)
mov    -0x124fe8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fe8(%rbp)
mov    -0x124fec(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x124fec(%rbp)
cmpl   $0x186a0,-0x124fe8(%rbp)
jl     17e3 <watershed+0x6e3>
mov    -0x124fe8(%rbp),%eax
sub    $0x186a0,%eax
mov    %eax,-0x124fe8(%rbp)
cmpl   $0x186a0,-0x124fec(%rbp)
jge    1800 <watershed+0x700>
cmpl   $0x0,-0x124fec(%rbp)
jge    180c <watershed+0x70c>
movl   $0x3,-0x4(%rbp)
jmp    185a <watershed+0x75a>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    181a <watershed+0x71a>
jmp    181f <watershed+0x71f>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1332 <watershed+0x232>
cmpl   $0x0,-0x48(%rbp)
jne    1840 <watershed+0x740>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1845 <watershed+0x745>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    130e <watershed+0x20e>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x124f70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<watershed>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x124fb8,%rsp
mov    %r9,%rbp
mov    %ecx,%r14d
mov    %rsi,%rbx
mov    %rdi,0x28(%rsp)
mov    0x124ff8(%rsp),%r15d
mov    %r8d,%eax
imul   %ecx,%eax
test   %eax,%eax
mov    %rdx,0x10(%rsp)
jle    1177 <watershed+0x67>
mov    %eax,%r12d
mov    %rbx,%rdi
xor    %esi,%esi
mov    %r12,%rdx
mov    %r8d,%r13d
call   1030 <memset@plt>
shl    $0x2,%r12
mov    0x10(%rsp),%rdi
mov    $0xff,%esi
mov    %r12,%rdx
call   1030 <memset@plt>
mov    %r13d,%r8d
mov    0x10(%rsp),%rdx
mov    %rbx,0x20(%rsp)
mov    0x124ff0(%rsp),%r9
xor    %esi,%esi
test   %r15d,%r15d
cmovle %esi,%r15d
xor    %ecx,%ecx
nop
cmp    %rsi,%r15
je     1203 <watershed+0xf3>
mov    0x0(%rbp,%rsi,4),%edi
mov    $0x1,%eax
test   %edi,%edi
js     11f1 <watershed+0xe1>
mov    (%r9,%rsi,4),%ebx
test   %ebx,%ebx
js     11f1 <watershed+0xe1>
mov    $0x2,%eax
cmp    %r14d,%edi
jge    11f1 <watershed+0xe1>
cmp    %r8d,%ebx
jge    11f1 <watershed+0xe1>
movslq %ecx,%rax
mov    %edi,0xc3530(%rsp,%rax,4)
mov    %ebx,0x61ab0(%rsp,%rax,4)
add    $0x1,%rsi
mov    %esi,0x30(%rsp,%rax,4)
lea    0x1(%rax),%edi
lea    -0x1869f(%rax),%ecx
cmp    $0x1869f,%eax
cmovl  %edi,%ecx
cmp    $0x186a0,%rsi
jne    1190 <watershed+0x80>
mov    $0x3,%eax
add    $0x124fb8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    -0x2(%r14),%eax
mov    %eax,0x1c(%rsp)
add    $0xfffffffe,%r8d
xor    %ebp,%ebp
xor    %r11d,%r11d
movl   $0x0,0xc(%rsp)
mov    %r8d,0x18(%rsp)
test   %r15d,%r15d
jle    1490 <watershed+0x380>
movl   $0x0,0x4(%rsp)
mov    %r15d,%r13d
mov    %r11d,0x8(%rsp)
jmp    124d <watershed+0x13d>
nopl   0x0(%rax)
mov    %r9d,%r13d
add    $0xffffffff,%r15d
je     149b <watershed+0x38b>
mov    %ebp,%esi
lea    0x1(%rsi),%eax
lea    -0x1869f(%rsi),%ebp
cmp    $0x1869f,%esi
cmovl  %eax,%ebp
lea    -0x186a1(%r13),%edi
mov    $0x3,%eax
cmp    $0xfffe7960,%edi
jb     11f1 <watershed+0xe1>
movslq %esi,%rbx
mov    0xc3530(%rsp,%rbx,4),%esi
mov    0x61ab0(%rsp,%rbx,4),%edi
lea    -0x1(%r13),%r9d
mov    %edi,%r10d
imul   %r14d,%r10d
add    %esi,%r10d
movslq %r10d,%r12
cmp    %r11d,(%rdx,%r12,4)
je     1240 <watershed+0x130>
mov    0x30(%rsp,%rbx,4),%r8d
mov    %r11d,(%rdx,%r12,4)
mov    0x28(%rsp),%rdx
mov    0xc(%rsp),%ebx
cmp    %ebx,(%rdx,%r12,4)
jle    1300 <watershed+0x1f0>
movslq %ecx,%rbx
mov    %esi,0xc3530(%rsp,%rbx,4)
mov    %edi,0x61ab0(%rsp,%rbx,4)
mov    %r8d,0x30(%rsp,%rbx,4)
lea    0x1(%rcx),%esi
cmp    $0x1869f,%ecx
lea    -0x1869f(%rcx),%ecx
cmovl  %esi,%ecx
cmp    $0x1869f,%r13d
mov    0x10(%rsp),%rdx
mov    0x8(%rsp),%r11d
jbe    1243 <watershed+0x133>
jmp    11f1 <watershed+0xe1>
nopl   (%rax)
mov    0x20(%rsp),%rdx
mov    %r8b,(%rdx,%r12,1)
test   %esi,%esi
jle    1315 <watershed+0x205>
cmpb   $0x0,-0x1(%r12,%rdx,1)
je     1320 <watershed+0x210>
mov    %r9d,%r13d
cmp    0x1c(%rsp),%esi
jle    1360 <watershed+0x250>
jmp    1368 <watershed+0x258>
lea    -0x1(%rsi),%r9d
movslq %ecx,%rbx
mov    %r9d,0xc3530(%rsp,%rbx,4)
mov    %edi,0x61ab0(%rsp,%rbx,4)
mov    %r8d,0x30(%rsp,%rbx,4)
cmp    $0x1869f,%r13d
ja     11f1 <watershed+0xe1>
lea    0x1(%rcx),%ebx
cmp    $0x1869f,%ecx
lea    -0x1869f(%rcx),%ecx
cmovl  %ebx,%ecx
cmp    0x1c(%rsp),%esi
jg     1368 <watershed+0x258>
cmpb   $0x0,0x1(%r12,%rdx,1)
je     13c3 <watershed+0x2b3>
test   %edi,%edi
jle    1410 <watershed+0x300>
mov    %r10d,%ebx
sub    %r14d,%ebx
movslq %ebx,%rbx
cmpb   $0x0,(%rdx,%rbx,1)
jne    1410 <watershed+0x300>
movslq %ecx,%r9
mov    %esi,0xc3530(%rsp,%r9,4)
lea    -0x1(%rdi),%ebx
mov    %ebx,0x61ab0(%rsp,%r9,4)
mov    %r8d,0x30(%rsp,%r9,4)
cmp    $0x1869e,%r13d
jg     11f1 <watershed+0xe1>
lea    0x1(%rcx),%ebx
cmp    $0x1869f,%ecx
lea    -0x1869f(%rcx),%ecx
cmovl  %ebx,%ecx
add    $0x1,%r13d
jmp    1410 <watershed+0x300>
lea    0x1(%rsi),%r9d
movslq %ecx,%rbx
mov    %r9d,0xc3530(%rsp,%rbx,4)
mov    %edi,0x61ab0(%rsp,%rbx,4)
mov    %r8d,0x30(%rsp,%rbx,4)
cmp    $0x1869e,%r13d
jg     11f1 <watershed+0xe1>
lea    0x1(%rcx),%ebx
cmp    $0x1869f,%ecx
lea    -0x1869f(%rcx),%ecx
cmovl  %ebx,%ecx
add    $0x1,%r13d
test   %edi,%edi
jg     1370 <watershed+0x260>
nopl   0x0(%rax)
cmp    0x18(%rsp),%edi
jle    1420 <watershed+0x310>
movl   $0x1,0x4(%rsp)
jmp    1434 <watershed+0x324>
movl   $0x1,0x4(%rsp)
add    %r14d,%r10d
movslq %r10d,%rbx
cmpb   $0x0,(%rdx,%rbx,1)
je     1443 <watershed+0x333>
mov    0x10(%rsp),%rdx
mov    0x8(%rsp),%r11d
jmp    1243 <watershed+0x133>
movslq %ecx,%rbx
mov    %esi,0xc3530(%rsp,%rbx,4)
add    $0x1,%edi
mov    %edi,0x61ab0(%rsp,%rbx,4)
mov    %r8d,0x30(%rsp,%rbx,4)
cmp    $0x1869e,%r13d
mov    0x10(%rsp),%rdx
mov    0x8(%rsp),%r11d
jg     11f1 <watershed+0xe1>
lea    0x1(%rcx),%eax
cmp    $0x1869f,%ecx
lea    -0x1869f(%rcx),%ecx
cmovl  %eax,%ecx
add    $0x1,%r13d
jmp    1243 <watershed+0x133>
xchg   %ax,%ax
movl   $0x0,0x4(%rsp)
mov    %r15d,%r13d
cmpl   $0x1,0x4(%rsp)
mov    0xc(%rsp),%esi
adc    $0x0,%esi
add    $0x1,%r11d
xor    %eax,%eax
mov    %r13d,%r15d
mov    %esi,0xc(%rsp)
cmp    $0x100,%esi
jb     1221 <watershed+0x111>
jmp    11f1 <watershed+0xe1>

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

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