#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ enumerate_ring_faces(int, int, int, int, void *, int *,
                                        void (*)(void *, int, int, int, int));
void enumerate_faces(unsigned short *data, void *h, int *count_ret,
                     void (*process_face)(void *h, int v1, int v2, int v3,
                                          int v4)) {
  int basevertex = 0, startofvertices = 0;
  int backrefs[5];
  while (1) {
    if (data[0] == 65534) {
      int steps;
      int prevsteps = -1, prevbase = 0;
      steps = data[1];
      data += 2;
      while (data[0] <= 65528) {
        if (data[0] == 65524) {
          backrefs[data[1]] = basevertex;
          data += 2;
          continue;
        }
        if (data[0] == 65526) {
          steps *= 2;
          data++;
          continue;
        } else if (data[0] == 65525) {
          steps /= 2;
          data++;
          continue;
        }
        if (data[0] == 65523) {
          if (prevsteps != -1) {
            enumerate_ring_faces(backrefs[data[1]], steps, prevbase, prevsteps,
                                 h, count_ret, process_face);
          }
          prevbase = backrefs[data[1]];
          data += 2;
        } else {
          int isseam = 0;
          if (data[0] == 65528) {
            isseam = 1;
            data++;
          }
          if (data[0] == 65527) {
            data += 2 + data[1] * 2;
          } else {
            if (data[0] == 0)
              steps = 1;
            data += 2;
          }
          if (prevsteps != -1) {
            enumerate_ring_faces(basevertex, steps, prevbase, prevsteps, h,
                                 count_ret, process_face);
          }
          if (isseam)
            basevertex += steps;
          prevbase = basevertex;
          basevertex += steps;
        }
        prevsteps = steps;
      }
    } else if (data[0] == 65530 || data[0] == 65529) {
      int v0 = -1, v1 = 0, v2, v3;
      if (data[0] == 65530)
        data += 2;
      else
        data++;
      while (data[0] <= 65528) {
        if (data[0] == 65523) {
          v2 = backrefs[data[1]] + data[2];
        } else {
          v2 = basevertex;
          basevertex++;
        }
        if (data[3] == 65523) {
          v3 = backrefs[data[4]] + data[5];
        } else {
          v3 = basevertex;
          basevertex++;
        }
        data += 6;
        if (v0 != -1) {
          process_face(h, v0, v1, v3, v2);
          if (count_ret)
            (*count_ret)++;
        }
        v0 = v2;
        v1 = v3;
      }
    } else if (data[0] == 65533) {
      data++;
      startofvertices = basevertex;
      while (data[0] <= 65528) {
        if (data[0] == 65524) {
          backrefs[data[1]] = basevertex;
          data += 2;
          continue;
        }
        data += 3;
        basevertex++;
      }
    } else if (data[0] == 65532) {
      data++;
      while (data[0] <= 65528) {
        process_face(h, data[0] + startofvertices, data[1] + startofvertices,
                     data[2] + startofvertices, data[3] + startofvertices);
        if (count_ret)
          (*count_ret)++;
        data += 4;
      }
    } else if (data[0] == 65531) {
      data++;
      while (data[0] <= 65528) {
        process_face(h, data[0] + startofvertices, data[1] + startofvertices,
                     data[2] + startofvertices, -1);
        if (count_ret)
          (*count_ret)++;
        data += 3;
      }
    } else {
      break;
    }
  }
}


x86 assembly (clang, -O0):
<enumerate_faces>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfffe,%eax
jne    135c <enumerate_faces+0x24c>
movl   $0xffffffff,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
mov    %eax,-0x44(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff8,%eax
jg     1357 <enumerate_faces+0x247>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff4,%eax
jne    11b1 <enumerate_faces+0xa1>
mov    -0x24(%rbp),%ecx
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
mov    %ecx,-0x40(%rbp,%rax,4)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
jmp    116d <enumerate_faces+0x5d>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff6,%eax
jne    11dd <enumerate_faces+0xcd>
mov    -0x44(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
jmp    116d <enumerate_faces+0x5d>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff5,%eax
jne    120e <enumerate_faces+0xfe>
mov    -0x44(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x44(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
jmp    116d <enumerate_faces+0x5d>
jmp    1213 <enumerate_faces+0x103>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff3,%eax
jne    1279 <enumerate_faces+0x169>
cmpl   $0xffffffff,-0x48(%rbp)
je     1259 <enumerate_faces+0x149>
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
mov    -0x40(%rbp,%rax,4),%edi
mov    -0x44(%rbp),%esi
mov    -0x4c(%rbp),%edx
mov    -0x48(%rbp),%ecx
mov    -0x10(%rbp),%r8
mov    -0x18(%rbp),%r9
mov    -0x20(%rbp),%rax
mov    %rax,(%rsp)
call   1030 <enumerate_ring_faces@plt>
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
mov    -0x40(%rbp,%rax,4),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
jmp    134c <enumerate_faces+0x23c>
movl   $0x0,-0x50(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff8,%eax
jne    12a5 <enumerate_faces+0x195>
movl   $0x1,-0x50(%rbp)
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff7,%eax
jne    12dc <enumerate_faces+0x1cc>
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%ecx
shl    $0x1,%ecx
add    $0x2,%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
jmp    12ff <enumerate_faces+0x1ef>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0x0,%eax
jne    12f3 <enumerate_faces+0x1e3>
movl   $0x1,-0x44(%rbp)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
cmpl   $0xffffffff,-0x48(%rbp)
je     132a <enumerate_faces+0x21a>
mov    -0x24(%rbp),%edi
mov    -0x44(%rbp),%esi
mov    -0x4c(%rbp),%edx
mov    -0x48(%rbp),%ecx
mov    -0x10(%rbp),%r8
mov    -0x18(%rbp),%r9
mov    -0x20(%rbp),%rax
mov    %rax,(%rsp)
call   1030 <enumerate_ring_faces@plt>
cmpl   $0x0,-0x50(%rbp)
je     133d <enumerate_faces+0x22d>
mov    -0x44(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x44(%rbp),%eax
add    -0x24(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x44(%rbp),%eax
mov    %eax,-0x48(%rbp)
jmp    116d <enumerate_faces+0x5d>
jmp    1670 <enumerate_faces+0x560>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfffa,%eax
je     1380 <enumerate_faces+0x270>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff9,%eax
jne    14b1 <enumerate_faces+0x3a1>
movl   $0xffffffff,-0x54(%rbp)
movl   $0x0,-0x58(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfffa,%eax
jne    13b1 <enumerate_faces+0x2a1>
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
jmp    13bd <enumerate_faces+0x2ad>
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
jmp    13c2 <enumerate_faces+0x2b2>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff8,%eax
jg     14ac <enumerate_faces+0x39c>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff3,%eax
jne    1404 <enumerate_faces+0x2f4>
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
mov    -0x40(%rbp,%rax,4),%eax
mov    -0x8(%rbp),%rcx
movzwl 0x4(%rcx),%ecx
add    %ecx,%eax
mov    %eax,-0x5c(%rbp)
jmp    1413 <enumerate_faces+0x303>
mov    -0x24(%rbp),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movzwl 0x6(%rax),%eax
cmp    $0xfff3,%eax
jne    1444 <enumerate_faces+0x334>
mov    -0x8(%rbp),%rax
movzwl 0x8(%rax),%eax
mov    -0x40(%rbp,%rax,4),%eax
mov    -0x8(%rbp),%rcx
movzwl 0xa(%rcx),%ecx
add    %ecx,%eax
mov    %eax,-0x60(%rbp)
jmp    1453 <enumerate_faces+0x343>
mov    -0x24(%rbp),%eax
mov    %eax,-0x60(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
add    $0xc,%rax
mov    %rax,-0x8(%rbp)
cmpl   $0xffffffff,-0x54(%rbp)
je     149b <enumerate_faces+0x38b>
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rdi
mov    -0x54(%rbp),%esi
mov    -0x58(%rbp),%edx
mov    -0x60(%rbp),%ecx
mov    -0x5c(%rbp),%r8d
call   *%rax
cmpq   $0x0,-0x18(%rbp)
je     1496 <enumerate_faces+0x386>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    149b <enumerate_faces+0x38b>
mov    -0x5c(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x60(%rbp),%eax
mov    %eax,-0x58(%rbp)
jmp    13c2 <enumerate_faces+0x2b2>
jmp    166b <enumerate_faces+0x55b>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfffd,%eax
jne    1538 <enumerate_faces+0x428>
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff8,%eax
jg     1533 <enumerate_faces+0x423>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff4,%eax
jne    1519 <enumerate_faces+0x409>
mov    -0x24(%rbp),%ecx
mov    -0x8(%rbp),%rax
movzwl 0x2(%rax),%eax
mov    %ecx,-0x40(%rbp,%rax,4)
mov    -0x8(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x8(%rbp)
jmp    14d5 <enumerate_faces+0x3c5>
mov    -0x8(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x8(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    14d5 <enumerate_faces+0x3c5>
jmp    1666 <enumerate_faces+0x556>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfffc,%eax
jne    15cb <enumerate_faces+0x4bb>
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff8,%eax
jg     15c6 <enumerate_faces+0x4b6>
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rdi
mov    -0x8(%rbp),%rcx
movzwl (%rcx),%esi
add    -0x28(%rbp),%esi
mov    -0x8(%rbp),%rcx
movzwl 0x2(%rcx),%edx
add    -0x28(%rbp),%edx
mov    -0x8(%rbp),%rcx
movzwl 0x4(%rcx),%ecx
add    -0x28(%rbp),%ecx
mov    -0x8(%rbp),%r8
movzwl 0x6(%r8),%r8d
add    -0x28(%rbp),%r8d
call   *%rax
cmpq   $0x0,-0x18(%rbp)
je     15b5 <enumerate_faces+0x4a5>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x8(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x8(%rbp)
jmp    1556 <enumerate_faces+0x446>
jmp    1661 <enumerate_faces+0x551>
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfffb,%eax
jne    1657 <enumerate_faces+0x547>
mov    -0x8(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movzwl (%rax),%eax
cmp    $0xfff8,%eax
jg     1652 <enumerate_faces+0x542>
mov    -0x20(%rbp),%rax
mov    -0x10(%rbp),%rdi
mov    -0x8(%rbp),%rcx
movzwl (%rcx),%esi
add    -0x28(%rbp),%esi
mov    -0x8(%rbp),%rcx
movzwl 0x2(%rcx),%edx
add    -0x28(%rbp),%edx
mov    -0x8(%rbp),%rcx
movzwl 0x4(%rcx),%ecx
add    -0x28(%rbp),%ecx
mov    $0xffffffff,%r8d
call   *%rax
cmpq   $0x0,-0x18(%rbp)
je     1641 <enumerate_faces+0x531>
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x8(%rbp),%rax
add    $0x6,%rax
mov    %rax,-0x8(%rbp)
jmp    15e9 <enumerate_faces+0x4d9>
jmp    165c <enumerate_faces+0x54c>
jmp    1675 <enumerate_faces+0x565>
jmp    1661 <enumerate_faces+0x551>
jmp    1666 <enumerate_faces+0x556>
jmp    166b <enumerate_faces+0x55b>
jmp    1670 <enumerate_faces+0x560>
jmp    1136 <enumerate_faces+0x26>
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<enumerate_faces>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %rcx,0x20(%rsp)
mov    %rdx,%r13
mov    %rsi,0x28(%rsp)
mov    %rdi,%r15
movzwl (%rdi),%r12d
xor    %eax,%eax
lea    0xec5(%rip),%rdx
movl   $0x0,0x14(%rsp)
mov    %r13,0x18(%rsp)
jmp    1160 <enumerate_faces+0x50>
add    $0x2,%rbx
mov    %rbx,%r15
mov    %r14d,%eax
mov    0x18(%rsp),%r13
lea    0xea0(%rip),%rdx
mov    %eax,%r14d
lea    0x7(%r12),%eax
cmp    $0x5,%ax
ja     1535 <enumerate_faces+0x425>
mov    %r15,%rbx
movzwl %ax,%eax
movslq (%rdx,%rax,4),%rax
add    %rdx,%rax
jmp    *%rax
xor    %eax,%eax
cmp    $0xfffa,%r12w
sete   %al
lea    (%rbx,%rax,2),%r15
add    $0x2,%r15
movzwl 0x2(%rbx,%rax,2),%r12d
mov    %r14d,%eax
cmp    $0xfff8,%r12w
ja     1160 <enumerate_faces+0x50>
mov    0x20(%rsp),%rbx
mov    $0xffffffff,%ebp
xor    %r13d,%r13d
jmp    11d0 <enumerate_faces+0xc0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzwl 0xc(%r15),%r12d
add    $0xc,%r15
cmp    $0xfff9,%r12w
jae    1151 <enumerate_faces+0x41>
mov    %ebp,%esi
mov    %r13d,%edx
cmp    $0xfff3,%r12w
jne    1200 <enumerate_faces+0xf0>
movzwl 0x2(%r15),%eax
movzwl 0x4(%r15),%ebp
add    0x30(%rsp,%rax,4),%ebp
mov    %r14d,%r13d
cmpw   $0xfff3,0x6(%r15)
je     120f <enumerate_faces+0xff>
lea    0x1(%r13),%r14d
cmp    $0xffffffff,%esi
jne    1228 <enumerate_faces+0x118>
jmp    11c0 <enumerate_faces+0xb0>
lea    0x1(%r14),%r13d
mov    %r14d,%ebp
cmpw   $0xfff3,0x6(%r15)
jne    11f5 <enumerate_faces+0xe5>
movzwl 0x8(%r15),%eax
mov    %r13d,%r14d
movzwl 0xa(%r15),%ecx
add    0x30(%rsp,%rax,4),%ecx
mov    %ecx,%r13d
cmp    $0xffffffff,%esi
je     11c0 <enumerate_faces+0xb0>
mov    0x28(%rsp),%rdi
mov    %r13d,%ecx
mov    %ebp,%r8d
call   *%rbx
cmpq   $0x0,0x18(%rsp)
je     11c0 <enumerate_faces+0xb0>
mov    0x18(%rsp),%rax
addl   $0x1,(%rax)
jmp    11c0 <enumerate_faces+0xb0>
lea    0x2(%rbx),%r15
movzwl 0x2(%rbx),%r12d
mov    %r14d,%eax
cmp    $0xfff8,%r12w
ja     1160 <enumerate_faces+0x50>
add    $0x8,%rbx
mov    0x28(%rsp),%r15
mov    0x14(%rsp),%ebp
jmp    1283 <enumerate_faces+0x173>
movzwl (%rbx),%r12d
add    $0x6,%rbx
cmp    $0xfff9,%r12w
jae    1505 <enumerate_faces+0x3f5>
movzwl %r12w,%esi
add    %ebp,%esi
movzwl -0x4(%rbx),%edx
add    %ebp,%edx
movzwl -0x2(%rbx),%ecx
add    %ebp,%ecx
mov    %r15,%rdi
mov    $0xffffffff,%r8d
call   *0x20(%rsp)
test   %r13,%r13
je     1270 <enumerate_faces+0x160>
addl   $0x1,0x0(%r13)
jmp    1270 <enumerate_faces+0x160>
lea    0x2(%rbx),%r15
movzwl 0x2(%rbx),%r12d
mov    %r14d,%eax
cmp    $0xfff8,%r12w
ja     1160 <enumerate_faces+0x50>
add    $0xa,%rbx
mov    0x28(%rsp),%r15
mov    0x14(%rsp),%ebp
jmp    12f3 <enumerate_faces+0x1e3>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzwl (%rbx),%r12d
add    $0x8,%rbx
cmp    $0xfff9,%r12w
jae    150b <enumerate_faces+0x3fb>
movzwl %r12w,%esi
add    %ebp,%esi
movzwl -0x6(%rbx),%edx
add    %ebp,%edx
movzwl -0x4(%rbx),%ecx
add    %ebp,%ecx
movzwl -0x2(%rbx),%r8d
add    %ebp,%r8d
mov    %r15,%rdi
call   *0x20(%rsp)
test   %r13,%r13
je     12e0 <enumerate_faces+0x1d0>
addl   $0x1,0x0(%r13)
jmp    12e0 <enumerate_faces+0x1d0>
movzwl 0x2(%rbx),%r12d
add    $0x2,%rbx
mov    %rbx,%r15
mov    %r14d,%eax
mov    %r14d,%ecx
mov    %r14d,0x14(%rsp)
cmp    $0xfff8,%r12w
ja     1160 <enumerate_faces+0x50>
mov    %r14d,%eax
add    $0x6,%rbx
nopl   0x0(%rax)
cmp    $0xfff4,%r12w
jne    1380 <enumerate_faces+0x270>
movzwl -0x4(%rbx),%ecx
mov    %eax,0x30(%rsp,%rcx,4)
movzwl -0x2(%rbx),%r12d
add    $0x4,%rbx
cmp    $0xfff9,%r12w
jb     1350 <enumerate_faces+0x240>
jmp    1521 <enumerate_faces+0x411>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x1,%eax
movzwl (%rbx),%r12d
cmp    $0xfff9,%r12w
jb     1345 <enumerate_faces+0x235>
jmp    1525 <enumerate_faces+0x415>
lea    0x4(%rbx),%r15
movzwl 0x4(%rbx),%r12d
mov    %r14d,%eax
cmp    $0xfff8,%r12w
ja     1160 <enumerate_faces+0x50>
movzwl 0x2(%rbx),%ebp
mov    $0xffffffff,%ecx
xor    %edx,%edx
mov    %r15,%rbx
mov    0x28(%rsp),%r8
nopl   (%rax)
cmp    $0xfff4,%r12w
jne    13f0 <enumerate_faces+0x2e0>
movzwl 0x2(%rbx),%eax
mov    %r14d,0x30(%rsp,%rax,4)
movzwl 0x4(%rbx),%r12d
add    $0x4,%rbx
cmp    $0xfff9,%r12w
jb     13c0 <enumerate_faces+0x2b0>
jmp    114e <enumerate_faces+0x3e>
cs nopw 0x0(%rax,%rax,1)
nop
cmp    $0xfff3,%r12w
je     1410 <enumerate_faces+0x300>
cmp    $0xfff5,%r12w
je     1450 <enumerate_faces+0x340>
cmp    $0xfff6,%r12w
jne    1480 <enumerate_faces+0x370>
add    %ebp,%ebp
jmp    145b <enumerate_faces+0x34b>
nopl   0x0(%rax)
cmp    $0xffffffff,%ecx
je     1432 <enumerate_faces+0x322>
movzwl 0x2(%rbx),%eax
mov    0x30(%rsp,%rax,4),%edi
mov    0x20(%rsp),%rax
mov    %rax,(%rsp)
mov    %ebp,%esi
mov    0x18(%rsp),%r9
call   1030 <enumerate_ring_faces@plt>
movzwl 0x2(%rbx),%eax
mov    0x30(%rsp,%rax,4),%edx
add    $0x4,%rbx
jmp    14ec <enumerate_faces+0x3dc>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %ebp,%eax
shr    $0x1f,%eax
add    %ebp,%eax
sar    %eax
mov    %eax,%ebp
lea    0x2(%rbx),%r15
movzwl 0x2(%rbx),%r12d
cmp    $0xfff9,%r12w
jb     13b5 <enumerate_faces+0x2a5>
jmp    114a <enumerate_faces+0x3a>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
xor    %eax,%eax
cmp    $0xfff8,%r12w
sete   %al
movzwl (%rbx,%rax,2),%edi
mov    $0x2,%esi
test   %di,%di
je     14ac <enumerate_faces+0x39c>
cmp    $0xfff7,%di
jne    14b1 <enumerate_faces+0x3a1>
movzwl 0x2(%rbx,%rax,2),%esi
add    %rsi,%rsi
add    $0x2,%rsi
jmp    14b1 <enumerate_faces+0x3a1>
mov    $0x1,%ebp
add    %rax,%rax
lea    (%rax,%rsi,2),%rax
add    %rax,%rbx
cmp    $0xffffffff,%ecx
je     14d8 <enumerate_faces+0x3c8>
mov    0x20(%rsp),%rax
mov    %rax,(%rsp)
mov    %r14d,%edi
mov    %ebp,%esi
mov    0x18(%rsp),%r9
call   1030 <enumerate_ring_faces@plt>
cmp    $0xfff8,%r12w
mov    $0x0,%edx
cmove  %ebp,%edx
add    %r14d,%edx
lea    (%rdx,%rbp,1),%r14d
mov    %rbx,%r15
movzwl (%rbx),%r12d
mov    %ebp,%ecx
cmp    $0xfff9,%r12w
jb     13b5 <enumerate_faces+0x2a5>
jmp    1151 <enumerate_faces+0x41>
add    $0xfffffffffffffffa,%rbx
jmp    150f <enumerate_faces+0x3ff>
add    $0xfffffffffffffff8,%rbx
mov    %rbx,%r15
mov    %r14d,%eax
lea    0xae4(%rip),%rdx
jmp    1160 <enumerate_faces+0x50>
add    $0xfffffffffffffffa,%rbx
mov    %rbx,%r15
mov    %r14d,%ecx
mov    %r14d,0x14(%rsp)
jmp    1160 <enumerate_faces+0x50>
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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