#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 */
struct object {
  int dummy;
};
struct model {
  int dummy;
};

/* Variables and functions */
int /*<<< orphan*/ debug(char *, ...);
scalar_t__ isspace(char);
struct object *model_object_create(struct model *, char *, int);
int /*<<< orphan*/ model_object_face_add(struct object *, int, int, int);
unsigned int strtol(char *, char **, int);
int /*<<< orphan*/ verbose(char *, ...);
int /*<<< orphan*/ warn(char *, ...);
int parse_face_data(const char *filename, unsigned line, struct model *m,
                    struct object **curr_grp, char *buf) {
  char *tmp, *idx = buf;
  unsigned i, j;
  int data[3][6];
  if (!*curr_grp) {
    debug("%s:%u:face data before group name\n", filename, line);
    *curr_grp = model_object_create(m, "ungrouped", 1);
    if (!*curr_grp) {
      debug("%s:%u:face data allocation error\n", filename, line);
      return 0;
    }
  }
  for (i = 0; i < 6; i++) {
    unsigned n;
    while (isspace(*idx))
      idx++;
    if (!*idx) {
      verbose("break[%u] %s:%u\n", i, filename, line);
      break;
    }
    for (j = 0; j < 3; j++) {
      if (*idx == '/') {
        data[j][i] = -1;
        idx++;
        continue;
      }
      if (isspace(*idx))
        break;
      n = strtol(idx, &tmp, 10);
      if (idx == tmp) {
        warn("%s:%u:face data corrupt.\n", filename, line);
        verbose("IDX='%s'\n", idx);
        return 0;
      }
      data[j][i] = n;
      idx = tmp;
      if (*idx != '/') {
        idx++;
        break;
      }
      idx++;
    }
  }
  debug("does this match? %d/%d/%d %d/%d/%d %d/%d/%d\n", data[0][0], data[1][0],
        data[2][0], data[0][1], data[1][1], data[2][1], data[0][2], data[1][2],
        data[2][2]);
  debug("\t%s\n", buf);
  if (data[0][0] == -1 || data[0][1] == -1 || data[0][2] == -1) {
    warn("%s:%u:Vertex field not supplied %d/%d/%d\n", filename, line,
         data[0][0], data[0][1], data[0][2]);
    debug("buf='%s'\n", buf);
    return 0;
  }
  debug("buf='%s'\n", buf);
  if (i == 3) {
    if (!model_object_face_add(*curr_grp, data[0][0] - 1, data[0][1] - 1,
                               data[0][2] - 1)) {
      return 0;
    }
    debug("data='%u %u %u'\n", data[0][0], data[0][1], data[0][2]);
  } else if (i == 4) {
    if (!model_object_face_add(*curr_grp, data[0][0] - 1, data[0][1] - 1,
                               data[0][2] - 1)) {
      return 0;
    }
    debug("data='%u %u %u'\n", data[0][0], data[0][1], data[0][2]);
    if (!model_object_face_add(*curr_grp, data[0][2] - 1, data[0][3] - 1,
                               data[0][0] - 1)) {
      return 0;
    }
    debug("data='%u %u %u'\n", data[0][2], data[0][3], data[0][0]);
  } else {
    warn("Tessellation needed: sides = %u\n", i);
  }
  for (; i < 6; i++) {
    for (j = 0; j < 3; j++) {
      data[j][i] = -1;
    }
  }
  if (data[1][0] == -1 || data[1][1] == -1 || data[1][2] == -1)
    warn("%s:%u:Texture field not supplied\n", filename, line);
  if (data[2][0] == -1 || data[2][1] == -1 || data[2][2] == -1)
    warn("%s:%u:Normal field not supplied\n", filename, line);
  return 1;
}


x86 assembly (clang, -O0):
<parse_face_data>:
push   %rbp
mov    %rsp,%rbp
push   %rbx
sub    $0xc8,%rsp
mov    %rdi,-0x18(%rbp)
mov    %esi,-0x1c(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
mov    %r8,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x30(%rbp),%rax
cmpq   $0x0,(%rax)
jne    120d <parse_face_data+0x9d>
mov    -0x18(%rbp),%rsi
mov    -0x1c(%rbp),%edx
lea    0xe4d(%rip),%rdi
mov    $0x0,%al
call   1050 <debug@plt>
mov    -0x28(%rbp),%rdi
lea    0xe5e(%rip),%rsi
mov    $0x1,%edx
call   1030 <model_object_create@plt>
mov    %rax,%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x30(%rbp),%rax
cmpq   $0x0,(%rax)
jne    1208 <parse_face_data+0x98>
mov    -0x18(%rbp),%rsi
mov    -0x1c(%rbp),%edx
lea    0xe38(%rip),%rdi
mov    $0x0,%al
call   1050 <debug@plt>
movl   $0x0,-0xc(%rbp)
jmp    16a4 <parse_face_data+0x534>
jmp    120d <parse_face_data+0x9d>
movl   $0x0,-0x4c(%rbp)
cmpl   $0x6,-0x4c(%rbp)
jae    13ac <parse_face_data+0x23c>
jmp    1223 <parse_face_data+0xb3>
mov    -0x48(%rbp),%rax
movsbl (%rax),%edi
call   1060 <isspace@plt>
cmp    $0x0,%rax
je     124a <parse_face_data+0xda>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    1223 <parse_face_data+0xb3>
mov    -0x48(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1274 <parse_face_data+0x104>
mov    -0x4c(%rbp),%esi
mov    -0x18(%rbp),%rdx
mov    -0x1c(%rbp),%ecx
lea    0xde7(%rip),%rdi
mov    $0x0,%al
call   1090 <verbose@plt>
jmp    13ac <parse_face_data+0x23c>
movl   $0x0,-0x50(%rbp)
cmpl   $0x3,-0x50(%rbp)
jae    1399 <parse_face_data+0x229>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    12c3 <parse_face_data+0x153>
mov    -0x50(%rbp),%eax
mov    %eax,%ecx
lea    -0xa0(%rbp),%rax
imul   $0x18,%rcx,%rcx
add    %rcx,%rax
mov    -0x4c(%rbp),%ecx
movl   $0xffffffff,(%rax,%rcx,4)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    138b <parse_face_data+0x21b>
mov    -0x48(%rbp),%rax
movsbl (%rax),%edi
call   1060 <isspace@plt>
cmp    $0x0,%rax
je     12de <parse_face_data+0x16e>
jmp    1399 <parse_face_data+0x229>
mov    -0x48(%rbp),%rdi
lea    -0x40(%rbp),%rsi
mov    $0xa,%edx
call   1070 <strtol@plt>
mov    %eax,-0xa4(%rbp)
mov    -0x48(%rbp),%rax
cmp    -0x40(%rbp),%rax
jne    1337 <parse_face_data+0x1c7>
mov    -0x18(%rbp),%rsi
mov    -0x1c(%rbp),%edx
lea    0xd4e(%rip),%rdi
mov    $0x0,%al
call   1040 <warn@plt>
mov    -0x48(%rbp),%rsi
lea    0xd56(%rip),%rdi
mov    $0x0,%al
call   1090 <verbose@plt>
movl   $0x0,-0xc(%rbp)
jmp    16a4 <parse_face_data+0x534>
mov    -0xa4(%rbp),%edx
mov    -0x50(%rbp),%eax
mov    %eax,%ecx
lea    -0xa0(%rbp),%rax
imul   $0x18,%rcx,%rcx
add    %rcx,%rax
mov    -0x4c(%rbp),%ecx
mov    %edx,(%rax,%rcx,4)
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
je     137f <parse_face_data+0x20f>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    1399 <parse_face_data+0x229>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    127b <parse_face_data+0x10b>
jmp    139e <parse_face_data+0x22e>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1214 <parse_face_data+0xa4>
mov    -0xa0(%rbp),%esi
mov    -0x88(%rbp),%edx
mov    -0x70(%rbp),%ecx
mov    -0x9c(%rbp),%r8d
mov    -0x84(%rbp),%r9d
mov    -0x6c(%rbp),%ebx
mov    -0x98(%rbp),%r11d
mov    -0x80(%rbp),%r10d
mov    -0x68(%rbp),%eax
lea    0xca3(%rip),%rdi
mov    %ebx,(%rsp)
mov    %r11d,0x8(%rsp)
mov    %r10d,0x10(%rsp)
mov    %eax,0x18(%rsp)
mov    $0x0,%al
call   1050 <debug@plt>
mov    -0x38(%rbp),%rsi
lea    0xcad(%rip),%rdi
mov    $0x0,%al
call   1050 <debug@plt>
cmpl   $0xffffffff,-0xa0(%rbp)
je     1432 <parse_face_data+0x2c2>
cmpl   $0xffffffff,-0x9c(%rbp)
je     1432 <parse_face_data+0x2c2>
cmpl   $0xffffffff,-0x98(%rbp)
jne    1479 <parse_face_data+0x309>
mov    -0x18(%rbp),%rsi
mov    -0x1c(%rbp),%edx
mov    -0xa0(%rbp),%ecx
mov    -0x9c(%rbp),%r8d
mov    -0x98(%rbp),%r9d
lea    0xc62(%rip),%rdi
mov    $0x0,%al
call   1040 <warn@plt>
mov    -0x38(%rbp),%rsi
lea    0xc7a(%rip),%rdi
mov    $0x0,%al
call   1050 <debug@plt>
movl   $0x0,-0xc(%rbp)
jmp    16a4 <parse_face_data+0x534>
mov    -0x38(%rbp),%rsi
lea    0xc5c(%rip),%rdi
mov    $0x0,%al
call   1050 <debug@plt>
cmpl   $0x3,-0x4c(%rbp)
jne    14f6 <parse_face_data+0x386>
mov    -0x30(%rbp),%rax
mov    (%rax),%rdi
mov    -0xa0(%rbp),%esi
sub    $0x1,%esi
mov    -0x9c(%rbp),%edx
sub    $0x1,%edx
mov    -0x98(%rbp),%ecx
sub    $0x1,%ecx
call   1080 <model_object_face_add@plt>
cmp    $0x0,%eax
jne    14d1 <parse_face_data+0x361>
movl   $0x0,-0xc(%rbp)
jmp    16a4 <parse_face_data+0x534>
mov    -0xa0(%rbp),%esi
mov    -0x9c(%rbp),%edx
mov    -0x98(%rbp),%ecx
lea    0xc00(%rip),%rdi
mov    $0x0,%al
call   1050 <debug@plt>
jmp    15d3 <parse_face_data+0x463>
cmpl   $0x4,-0x4c(%rbp)
jne    15bd <parse_face_data+0x44d>
mov    -0x30(%rbp),%rax
mov    (%rax),%rdi
mov    -0xa0(%rbp),%esi
sub    $0x1,%esi
mov    -0x9c(%rbp),%edx
sub    $0x1,%edx
mov    -0x98(%rbp),%ecx
sub    $0x1,%ecx
call   1080 <model_object_face_add@plt>
cmp    $0x0,%eax
jne    153c <parse_face_data+0x3cc>
movl   $0x0,-0xc(%rbp)
jmp    16a4 <parse_face_data+0x534>
mov    -0xa0(%rbp),%esi
mov    -0x9c(%rbp),%edx
mov    -0x98(%rbp),%ecx
lea    0xb95(%rip),%rdi
mov    $0x0,%al
call   1050 <debug@plt>
mov    -0x30(%rbp),%rax
mov    (%rax),%rdi
mov    -0x98(%rbp),%esi
sub    $0x1,%esi
mov    -0x94(%rbp),%edx
sub    $0x1,%edx
mov    -0xa0(%rbp),%ecx
sub    $0x1,%ecx
call   1080 <model_object_face_add@plt>
cmp    $0x0,%eax
jne    1598 <parse_face_data+0x428>
movl   $0x0,-0xc(%rbp)
jmp    16a4 <parse_face_data+0x534>
mov    -0x98(%rbp),%esi
mov    -0x94(%rbp),%edx
mov    -0xa0(%rbp),%ecx
lea    0xb39(%rip),%rdi
mov    $0x0,%al
call   1050 <debug@plt>
jmp    15ce <parse_face_data+0x45e>
mov    -0x4c(%rbp),%esi
lea    0xb34(%rip),%rdi
mov    $0x0,%al
call   1040 <warn@plt>
jmp    15d3 <parse_face_data+0x463>
jmp    15d8 <parse_face_data+0x468>
cmpl   $0x6,-0x4c(%rbp)
jae    1631 <parse_face_data+0x4c1>
movl   $0x0,-0x50(%rbp)
cmpl   $0x3,-0x50(%rbp)
jae    161e <parse_face_data+0x4ae>
mov    -0x50(%rbp),%eax
mov    %eax,%ecx
lea    -0xa0(%rbp),%rax
imul   $0x18,%rcx,%rcx
add    %rcx,%rax
mov    -0x4c(%rbp),%ecx
movl   $0xffffffff,(%rax,%rcx,4)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    15e9 <parse_face_data+0x479>
jmp    1623 <parse_face_data+0x4b3>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    15d8 <parse_face_data+0x468>
cmpl   $0xffffffff,-0x88(%rbp)
je     1655 <parse_face_data+0x4e5>
cmpl   $0xffffffff,-0x84(%rbp)
je     1655 <parse_face_data+0x4e5>
cmpl   $0xffffffff,-0x80(%rbp)
jne    166a <parse_face_data+0x4fa>
mov    -0x18(%rbp),%rsi
mov    -0x1c(%rbp),%edx
lea    0xab9(%rip),%rdi
mov    $0x0,%al
call   1040 <warn@plt>
cmpl   $0xffffffff,-0x70(%rbp)
je     1688 <parse_face_data+0x518>
cmpl   $0xffffffff,-0x6c(%rbp)
je     1688 <parse_face_data+0x518>
cmpl   $0xffffffff,-0x68(%rbp)
jne    169d <parse_face_data+0x52d>
mov    -0x18(%rbp),%rsi
mov    -0x1c(%rbp),%edx
lea    0xaa8(%rip),%rdi
mov    $0x0,%al
call   1040 <warn@plt>
movl   $0x1,-0xc(%rbp)
mov    -0xc(%rbp),%eax
add    $0xc8,%rsp
pop    %rbx
pop    %rbp
ret

x86 assembly (clang, -O2):
<parse_face_data>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x88,%rsp
mov    %r8,%r13
mov    %rcx,%rbp
mov    %esi,%ebx
mov    %rdi,%r12
cmpq   $0x0,(%rcx)
jne    11cc <parse_face_data+0x5c>
mov    %rdx,%r14
lea    0xe64(%rip),%rdi
xor    %r15d,%r15d
mov    %r12,%rsi
mov    %ebx,%edx
xor    %eax,%eax
call   1050 <debug@plt>
lea    0xe71(%rip),%rsi
mov    %r14,%rdi
mov    $0x1,%edx
call   1030 <model_object_create@plt>
mov    %rax,0x0(%rbp)
test   %rax,%rax
je     149c <parse_face_data+0x32c>
mov    %ebx,0x8(%rsp)
mov    %rbp,0x80(%rsp)
xor    %ebp,%ebp
lea    0x20(%rsp),%r14
mov    %r13,%rbx
jmp    1204 <parse_face_data+0x94>
movl   $0xffffffff,0x60(%rsp,%rbp,4)
ff
mov    %rbx,%rcx
add    $0x1,%rcx
mov    %rcx,%rbx
add    $0x1,%rbp
cmp    $0x6,%rbp
je     1331 <parse_face_data+0x1c1>
add    $0xffffffffffffffff,%rbx
nopl   0x0(%rax,%rax,1)
movsbl 0x1(%rbx),%edi
add    $0x1,%rbx
call   1060 <isspace@plt>
test   %rax,%rax
jne    1210 <parse_face_data+0xa0>
mov    (%rbx),%al
cmp    $0x2f,%al
je     1270 <parse_face_data+0x100>
test   %al,%al
je     1340 <parse_face_data+0x1d0>
movsbl %al,%edi
call   1060 <isspace@plt>
test   %rax,%rax
jne    11f6 <parse_face_data+0x86>
mov    %rbx,%rdi
mov    %r14,%rsi
mov    $0xa,%edx
call   1070 <strtol@plt>
mov    0x20(%rsp),%rcx
cmp    %rcx,%rbx
je     146e <parse_face_data+0x2fe>
mov    %eax,0x30(%rsp,%rbp,4)
cmpb   $0x2f,(%rcx)
jne    11ef <parse_face_data+0x7f>
jmp    127b <parse_face_data+0x10b>
cs nopw 0x0(%rax,%rax,1)
movl   $0xffffffff,0x30(%rsp,%rbp,4)
ff
mov    %rbx,%rcx
mov    0x1(%rcx),%al
mov    %rcx,%rbx
add    $0x1,%rbx
cmp    $0x2f,%al
jne    12f0 <parse_face_data+0x180>
movl   $0xffffffff,0x48(%rsp,%rbp,4)
ff
mov    %rbx,%rcx
mov    0x1(%rcx),%al
mov    %rcx,%rbx
add    $0x1,%rbx
cmp    $0x2f,%al
je     11e4 <parse_face_data+0x74>
movsbl %al,%edi
call   1060 <isspace@plt>
test   %rax,%rax
jne    11f6 <parse_face_data+0x86>
mov    %rbx,%rdi
mov    %r14,%rsi
mov    $0xa,%edx
call   1070 <strtol@plt>
mov    0x20(%rsp),%rcx
cmp    %rcx,%rbx
je     146e <parse_face_data+0x2fe>
mov    %eax,0x60(%rsp,%rbp,4)
cmpb   $0x2f,(%rcx)
jmp    11ef <parse_face_data+0x7f>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsbl %al,%edi
call   1060 <isspace@plt>
test   %rax,%rax
jne    11f6 <parse_face_data+0x86>
mov    %rbx,%rdi
mov    %r14,%rsi
mov    $0xa,%edx
call   1070 <strtol@plt>
mov    0x20(%rsp),%rcx
cmp    %rcx,%rbx
je     146e <parse_face_data+0x2fe>
mov    %eax,0x48(%rsp,%rbp,4)
cmpb   $0x2f,(%rcx)
jne    11ef <parse_face_data+0x7f>
jmp    1294 <parse_face_data+0x124>
mov    %r13,%r15
mov    %r12,0x18(%rsp)
mov    $0x6,%ebp
jmp    135f <parse_face_data+0x1ef>
mov    %r13,%r15
lea    0xd05(%rip),%rdi
mov    %ebp,%esi
mov    %r12,0x18(%rsp)
mov    %r12,%rdx
mov    0x8(%rsp),%ecx
xor    %eax,%eax
call   1090 <verbose@plt>
mov    0x30(%rsp),%r14d
mov    0x34(%rsp),%r13d
mov    0x48(%rsp),%edx
mov    0x60(%rsp),%ecx
mov    0x4c(%rsp),%r9d
mov    0x64(%rsp),%r10d
mov    0x38(%rsp),%r11d
mov    0x50(%rsp),%r12d
mov    0x68(%rsp),%ebx
lea    0xcf4(%rip),%rdi
mov    %r14d,%esi
mov    %edx,0x2c(%rsp)
mov    %r13d,%r8d
mov    %r9d,0xc(%rsp)
xor    %eax,%eax
push   %rbx
mov    %r11,%rbx
mov    %r12,0x18(%rsp)
push   %r12
push   %r11
push   %r10
call   1050 <debug@plt>
add    $0x20,%rsp
lea    0xcf1(%rip),%rdi
mov    %r15,%rsi
xor    %eax,%eax
call   1050 <debug@plt>
cmp    $0xffffffff,%r14d
je     1435 <parse_face_data+0x2c5>
cmp    $0xffffffff,%r13d
je     1435 <parse_face_data+0x2c5>
cmp    $0xffffffff,%ebx
je     1435 <parse_face_data+0x2c5>
lea    0xcfe(%rip),%rdi
mov    %r15,%rsi
xor    %eax,%eax
call   1050 <debug@plt>
cmp    $0x4,%ebp
je     14b4 <parse_face_data+0x344>
cmp    $0x3,%ebp
jne    1545 <parse_face_data+0x3d5>
mov    0x80(%rsp),%rax
mov    (%rax),%rdi
lea    -0x1(%r14),%esi
lea    -0x1(%r13),%edx
lea    -0x1(%rbx),%ecx
call   1080 <model_object_face_add@plt>
test   %eax,%eax
je     15a9 <parse_face_data+0x439>
lea    0xcc2(%rip),%rdi
mov    %r14d,%esi
mov    %r13d,%edx
mov    %ebx,%ecx
jmp    1537 <parse_face_data+0x3c7>
lea    0xc7a(%rip),%rdi
mov    0x18(%rsp),%rsi
mov    0x8(%rsp),%edx
mov    %r14d,%ecx
mov    %r13d,%r8d
mov    %ebx,%r9d
xor    %eax,%eax
call   1040 <warn@plt>
lea    0xc84(%rip),%rdi
mov    %r15,%rsi
xor    %eax,%eax
call   1050 <debug@plt>
xor    %r15d,%r15d
jmp    16f5 <parse_face_data+0x585>
lea    0xbeb(%rip),%rdi
xor    %r15d,%r15d
mov    %r12,%rsi
mov    0x8(%rsp),%edx
xor    %eax,%eax
call   1040 <warn@plt>
lea    0xbed(%rip),%rdi
mov    %rbx,%rsi
xor    %eax,%eax
call   1090 <verbose@plt>
jmp    16f5 <parse_face_data+0x585>
lea    0xb8a(%rip),%rdi
mov    %r12,%rsi
mov    %ebx,%edx
xor    %eax,%eax
call   1050 <debug@plt>
jmp    16f5 <parse_face_data+0x585>
mov    0x80(%rsp),%r12
mov    (%r12),%rdi
lea    -0x1(%r14),%esi
lea    -0x1(%r13),%edx
mov    %rbx,0x10(%rsp)
add    $0xffffffff,%ebx
mov    %esi,0xc(%rsp)
mov    %ebx,%ecx
call   1080 <model_object_face_add@plt>
test   %eax,%eax
mov    $0x0,%r15d
je     16f5 <parse_face_data+0x585>
lea    0xbfa(%rip),%rdi
xor    %r15d,%r15d
mov    %r14d,%esi
mov    %r13d,%edx
mov    0x10(%rsp),%rcx
xor    %eax,%eax
call   1050 <debug@plt>
mov    (%r12),%rdi
mov    0x3c(%rsp),%r13d
lea    -0x1(%r13),%edx
mov    %ebx,%esi
mov    0xc(%rsp),%ecx
call   1080 <model_object_face_add@plt>
test   %eax,%eax
je     16f5 <parse_face_data+0x585>
lea    0xbbe(%rip),%rdi
mov    0x10(%rsp),%rsi
mov    %r13d,%edx
mov    %r14d,%ecx
xor    %eax,%eax
call   1050 <debug@plt>
mov    0x8(%rsp),%r14d
jmp    1570 <parse_face_data+0x400>
lea    0xbaf(%rip),%rdi
mov    %ebp,%esi
xor    %eax,%eax
call   1040 <warn@plt>
cmp    $0x5,%ebp
mov    0x8(%rsp),%r14d
mov    0x10(%rsp),%rax
mov    0xc(%rsp),%ecx
mov    0x2c(%rsp),%edx
ja     169e <parse_face_data+0x52e>
mov    %ebp,%eax
mov    $0x6,%ecx
sub    %rax,%rcx
cmp    $0x4,%rcx
jb     1670 <parse_face_data+0x500>
mov    %rcx,%rdx
and    $0xfffffffffffffffc,%rdx
lea    -0x4(%rdx),%rbp
mov    %rbp,%rdi
shr    $0x2,%rdi
add    $0x1,%rdi
mov    %edi,%esi
and    $0x3,%esi
cmp    $0xc,%rbp
jae    15b1 <parse_face_data+0x441>
xor    %ebp,%ebp
jmp    1621 <parse_face_data+0x4b1>
xor    %r15d,%r15d
jmp    16f5 <parse_face_data+0x585>
and    $0xfffffffffffffffc,%rdi
lea    (%rsp,%rax,4),%rbx
add    $0x90,%rbx
xor    %ebp,%ebp
pcmpeqd %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
movdqu %xmm0,-0x60(%rbx,%rbp,4)
movdqu %xmm0,-0x48(%rbx,%rbp,4)
movdqu %xmm0,-0x30(%rbx,%rbp,4)
movdqu %xmm0,-0x50(%rbx,%rbp,4)
movdqu %xmm0,-0x38(%rbx,%rbp,4)
movdqu %xmm0,-0x20(%rbx,%rbp,4)
movdqu %xmm0,-0x40(%rbx,%rbp,4)
movdqu %xmm0,-0x28(%rbx,%rbp,4)
movdqu %xmm0,-0x10(%rbx,%rbp,4)
movdqu %xmm0,-0x30(%rbx,%rbp,4)
movdqu %xmm0,-0x18(%rbx,%rbp,4)
movdqu %xmm0,(%rbx,%rbp,4)
add    $0x10,%rbp
add    $0xfffffffffffffffc,%rdi
jne    15d0 <parse_face_data+0x460>
test   %rsi,%rsi
je     165a <parse_face_data+0x4ea>
add    %rax,%rbp
lea    (%rsp,%rbp,4),%rdi
add    $0x30,%rdi
shl    $0x4,%rsi
xor    %ebp,%ebp
pcmpeqd %xmm0,%xmm0
nopl   0x0(%rax,%rax,1)
movdqu %xmm0,(%rdi,%rbp,1)
movdqu %xmm0,0x18(%rdi,%rbp,1)
movdqu %xmm0,0x30(%rdi,%rbp,1)
add    $0x10,%rbp
cmp    %rbp,%rsi
jne    1640 <parse_face_data+0x4d0>
cmp    %rdx,%rcx
je     1692 <parse_face_data+0x522>
add    %rdx,%rax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movl   $0xffffffff,0x30(%rsp,%rax,4)
ff
movl   $0xffffffff,0x48(%rsp,%rax,4)
ff
movl   $0xffffffff,0x60(%rsp,%rax,4)
ff
add    $0x1,%rax
cmp    $0x6,%rax
jne    1670 <parse_face_data+0x500>
mov    0x48(%rsp),%edx
mov    0x4c(%rsp),%ecx
mov    0x50(%rsp),%eax
cmp    $0xffffffff,%edx
mov    0x18(%rsp),%rbx
je     16b2 <parse_face_data+0x542>
cmp    $0xffffffff,%ecx
je     16b2 <parse_face_data+0x542>
cmp    $0xffffffff,%eax
jne    16c6 <parse_face_data+0x556>
lea    0xa63(%rip),%rdi
mov    %rbx,%rsi
mov    %r14d,%edx
xor    %eax,%eax
call   1040 <warn@plt>
cmpl   $0xffffffff,0x60(%rsp)
mov    $0x1,%r15d
je     16e1 <parse_face_data+0x571>
cmpl   $0xffffffff,0x64(%rsp)
je     16e1 <parse_face_data+0x571>
cmpl   $0xffffffff,0x68(%rsp)
jne    16f5 <parse_face_data+0x585>
lea    0xa56(%rip),%rdi
mov    %rbx,%rsi
mov    %r14d,%edx
xor    %eax,%eax
call   1040 <warn@plt>
mov    %r15d,%eax
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
%struct.model = type { i32 }
%struct.object = type { i32 }
@.str = [35 x i8] c"%s:%u:face data before group name\0A\00"
@.str.1 = [10 x i8] c"ungrouped\00"
@.str.2 = [34 x i8] c"%s:%u:face data allocation error\0A\00"
@.str.3 = [17 x i8] c"break[%u] %s:%u\0A\00"
@.str.4 = [26 x i8] c"%s:%u:face data corrupt.\0A\00"
@.str.5 = [10 x i8] c"IDX='%s'\0A\00"
@.str.6 = [45 x i8] c"does this match? %d/%d/%d %d/%d/%d %d/%d/%d\0A\00"
@.str.7 = [5 x i8] c"\09%s\0A\00"
@.str.8 = [42 x i8] c"%s:%u:Vertex field not supplied %d/%d/%d\0A\00"
@.str.9 = [10 x i8] c"buf='%s'\0A\00"
@.str.10 = [17 x i8] c"data='%u %u %u'\0A\00"
@.str.11 = [33 x i8] c"Tessellation needed: sides = %u\0A\00"
@.str.12 = [34 x i8] c"%s:%u:Texture field not supplied\0A\00"
@.str.13 = [33 x i8] c"%s:%u:Normal field not supplied\0A\00"
define i32 @parse_face_data(i8* %0, i32 %1, %struct.model* %2, %struct.object** nocapture %3, i8* %4) {
%6 = alloca i8*
%7 = alloca [3 x [6 x i32]]
%8 = bitcast i8** %6 to i8*
%9 = bitcast [3 x [6 x i32]]* %7 to i8*
%10 = load %struct.object*, %struct.object** %3
%11 = icmp eq %struct.object* %10, null
br i1 %11, label %13, label %12
12: ; preds = %13, %5
br label %19
13: ; preds = %5
%14 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str, i64 0, i64 0), i8* %0, i32 %1)
%15 = tail call %struct.object* @model_object_create(%struct.model* %2, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i64 0, i64 0), i32 1)
store %struct.object* %15, %struct.object** %3
%16 = icmp eq %struct.object* %15, null
br i1 %16, label %17, label %12
17: ; preds = %13
%18 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.2, i64 0, i64 0), i8* %0, i32 %1)
br label %261
19: ; preds = %12, %92
%20 = phi i64 [ %94, %92 ], [ 0, %12 ]
%21 = phi i8* [ %93, %92 ], [ %4, %12 ]
br label %22
22: ; preds = %22, %19
%23 = phi i8* [ %27, %22 ], [ %21, %19 ]
%24 = load i8, i8* %23
%25 = tail call i64 @isspace(i8 signext %24)
%26 = icmp eq i64 %25, 0
%27 = getelementptr inbounds i8, i8* %23, i64 1
br i1 %26, label %28, label %22
28: ; preds = %22
%29 = load i8, i8* %23
switch i8 %29, label %32 [
i8 0, label %89
i8 47, label %30
]
30: ; preds = %28
%31 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 %20
store i32 -1, i32* %31
br label %50
32: ; preds = %28
%33 = tail call i64 @isspace(i8 signext %29)
%34 = icmp eq i64 %33, 0
br i1 %34, label %35, label %92
35: ; preds = %32
%36 = call i32 @strtol(i8* %23, i8** %6, i32 10)
%37 = load i8*, i8** %6
%38 = icmp eq i8* %23, %37
br i1 %38, label %39, label %43
39: ; preds = %76, %58, %35
%40 = phi i8* [ %23, %35 ], [ %52, %58 ], [ %70, %76 ]
%41 = tail call i32 (i8*, ...) @warn(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.4, i64 0, i64 0), i8* %0, i32 %1)
%42 = tail call i32 (i8*, ...) @verbose(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i64 0, i64 0), i8* %40)
br label %261
43: ; preds = %35
%44 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 %20
store i32 %36, i32* %44
%45 = load i8, i8* %37
%46 = icmp eq i8 %45, 47
br i1 %46, label %50, label %47
47: ; preds = %80, %62, %43
%48 = phi i8* [ %37, %43 ], [ %60, %62 ], [ %78, %80 ]
%49 = getelementptr inbounds i8, i8* %48, i64 1
br label %92
50: ; preds = %43, %30
%51 = phi i8* [ %23, %30 ], [ %37, %43 ]
%52 = getelementptr inbounds i8, i8* %51, i64 1
%53 = load i8, i8* %52
%54 = icmp eq i8 %53, 47
br i1 %54, label %66, label %55
55: ; preds = %50
%56 = tail call i64 @isspace(i8 signext %53)
%57 = icmp eq i64 %56, 0
br i1 %57, label %58, label %92
58: ; preds = %55
%59 = call i32 @strtol(i8* %52, i8** %6, i32 10)
%60 = load i8*, i8** %6
%61 = icmp eq i8* %52, %60
br i1 %61, label %39, label %62
62: ; preds = %58
%63 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 %20
store i32 %59, i32* %63
%64 = load i8, i8* %60
%65 = icmp eq i8 %64, 47
br i1 %65, label %68, label %47
66: ; preds = %50
%67 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 %20
store i32 -1, i32* %67
br label %68
68: ; preds = %66, %62
%69 = phi i8* [ %52, %66 ], [ %60, %62 ]
%70 = getelementptr inbounds i8, i8* %69, i64 1
%71 = load i8, i8* %70
%72 = icmp eq i8 %71, 47
br i1 %72, label %84, label %73
73: ; preds = %68
%74 = tail call i64 @isspace(i8 signext %71)
%75 = icmp eq i64 %74, 0
br i1 %75, label %76, label %92
76: ; preds = %73
%77 = call i32 @strtol(i8* %70, i8** %6, i32 10)
%78 = load i8*, i8** %6
%79 = icmp eq i8* %70, %78
br i1 %79, label %39, label %80
80: ; preds = %76
%81 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 %20
store i32 %77, i32* %81
%82 = load i8, i8* %78
%83 = icmp eq i8 %82, 47
br i1 %83, label %86, label %47
84: ; preds = %68
%85 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 %20
store i32 -1, i32* %85
br label %86
86: ; preds = %84, %80
%87 = phi i8* [ %70, %84 ], [ %78, %80 ]
%88 = getelementptr inbounds i8, i8* %87, i64 1
br label %92
89: ; preds = %28
%90 = trunc i64 %20 to i32
%91 = tail call i32 (i8*, ...) @verbose(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.3, i64 0, i64 0), i32 %90, i8* %0, i32 %1)
br label %96
92: ; preds = %32, %55, %73, %86, %47
%93 = phi i8* [ %49, %47 ], [ %23, %32 ], [ %52, %55 ], [ %70, %73 ], [ %88, %86 ]
%94 = add nuw nsw i64 %20, 1
%95 = icmp eq i64 %94, 6
br i1 %95, label %96, label %19
96: ; preds = %92, %89
%97 = phi i32 [ %90, %89 ], [ 6, %92 ]
%98 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 0
%99 = load i32, i32* %98
%100 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 0
%101 = load i32, i32* %100
%102 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 0
%103 = load i32, i32* %102
%104 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 1
%105 = load i32, i32* %104
%106 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 1
%107 = load i32, i32* %106
%108 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 1
%109 = load i32, i32* %108
%110 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 2
%111 = load i32, i32* %110
%112 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 2
%113 = load i32, i32* %112
%114 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 2
%115 = load i32, i32* %114
%116 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.6, i64 0, i64 0), i32 %99, i32 %101, i32 %103, i32 %105, i32 %107, i32 %109, i32 %111, i32 %113, i32 %115)
%117 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.7, i64 0, i64 0), i8* %4)
%118 = icmp eq i32 %99, -1
%119 = icmp eq i32 %105, -1
%120 = or i1 %118, %119
%121 = icmp eq i32 %111, -1
%122 = or i1 %120, %121
br i1 %122, label %123, label %126
123: ; preds = %96
%124 = tail call i32 (i8*, ...) @warn(i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str.8, i64 0, i64 0), i8* %0, i32 %1, i32 %99, i32 %105, i32 %111)
%125 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i64 0, i64 0), i8* %4)
br label %261
126: ; preds = %96
%127 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i64 0, i64 0), i8* %4)
switch i32 %97, label %154 [
i32 3, label %128
i32 4, label %137
]
128: ; preds = %126
%129 = load %struct.object*, %struct.object** %3
%130 = add nsw i32 %99, -1
%131 = add nsw i32 %105, -1
%132 = add nsw i32 %111, -1
%133 = tail call i32 @model_object_face_add(%struct.object* %129, i32 %130, i32 %131, i32 %132)
%134 = icmp eq i32 %133, 0
br i1 %134, label %261, label %135
135: ; preds = %128
%136 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.10, i64 0, i64 0), i32 %99, i32 %105, i32 %111)
br label %157
137: ; preds = %126
%138 = load %struct.object*, %struct.object** %3
%139 = add nsw i32 %99, -1
%140 = add nsw i32 %105, -1
%141 = add nsw i32 %111, -1
%142 = tail call i32 @model_object_face_add(%struct.object* %138, i32 %139, i32 %140, i32 %141)
%143 = icmp eq i32 %142, 0
br i1 %143, label %261, label %144
144: ; preds = %137
%145 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.10, i64 0, i64 0), i32 %99, i32 %105, i32 %111)
%146 = load %struct.object*, %struct.object** %3
%147 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 3
%148 = load i32, i32* %147
%149 = add nsw i32 %148, -1
%150 = tail call i32 @model_object_face_add(%struct.object* %146, i32 %141, i32 %149, i32 %139)
%151 = icmp eq i32 %150, 0
br i1 %151, label %261, label %152
152: ; preds = %144
%153 = tail call i32 (i8*, ...) @debug(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.10, i64 0, i64 0), i32 %111, i32 %148, i32 %99)
br label %157
154: ; preds = %126
%155 = tail call i32 (i8*, ...) @warn(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.11, i64 0, i64 0), i32 %97)
%156 = icmp ult i32 %97, 6
br i1 %156, label %157, label %239
157: ; preds = %135, %152, %154
%158 = zext i32 %97 to i64
%159 = sub nsw i64 6, %158
%160 = icmp ult i64 %159, 4
br i1 %160, label %226, label %161
161: ; preds = %157
%162 = and i64 %159, -4
%163 = add nsw i64 %162, %158
%164 = add nsw i64 %162, -4
%165 = lshr exact i64 %164, 2
%166 = add nuw nsw i64 %165, 1
%167 = and i64 %166, 3
%168 = icmp ult i64 %164, 12
br i1 %168, label %208, label %169
169: ; preds = %161
%170 = and i64 %166, 9223372036854775804
br label %171
171: ; preds = %171, %169
%172 = phi i64 [ 0, %169 ], [ %205, %171 ]
%173 = phi i64 [ 0, %169 ], [ %206, %171 ]
%174 = add i64 %172, %158
%175 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 %174
%176 = bitcast i32* %175 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %176
%177 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 %174
%178 = bitcast i32* %177 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %178
%179 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 %174
%180 = bitcast i32* %179 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %180
%181 = or i64 %172, 4
%182 = add i64 %181, %158
%183 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 %182
%184 = bitcast i32* %183 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %184
%185 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 %182
%186 = bitcast i32* %185 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %186
%187 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 %182
%188 = bitcast i32* %187 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %188
%189 = or i64 %172, 8
%190 = add i64 %189, %158
%191 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 %190
%192 = bitcast i32* %191 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %192
%193 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 %190
%194 = bitcast i32* %193 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %194
%195 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 %190
%196 = bitcast i32* %195 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %196
%197 = or i64 %172, 12
%198 = add i64 %197, %158
%199 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 %198
%200 = bitcast i32* %199 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %200
%201 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 %198
%202 = bitcast i32* %201 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %202
%203 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 %198
%204 = bitcast i32* %203 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %204
%205 = add nuw i64 %172, 16
%206 = add nuw i64 %173, 4
%207 = icmp eq i64 %206, %170
br i1 %207, label %208, label %171
208: ; preds = %171, %161
%209 = phi i64 [ 0, %161 ], [ %205, %171 ]
%210 = icmp eq i64 %167, 0
br i1 %210, label %224, label %211
211: ; preds = %208, %211
%212 = phi i64 [ %221, %211 ], [ %209, %208 ]
%213 = phi i64 [ %222, %211 ], [ 0, %208 ]
%214 = add i64 %212, %158
%215 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 %214
%216 = bitcast i32* %215 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %216
%217 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 %214
%218 = bitcast i32* %217 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %218
%219 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 %214
%220 = bitcast i32* %219 to <4 x i32>*
store <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32>* %220
%221 = add nuw i64 %212, 4
%222 = add i64 %213, 1
%223 = icmp eq i64 %222, %167
br i1 %223, label %224, label %211
224: ; preds = %211, %208
%225 = icmp eq i64 %159, %162
br i1 %225, label %235, label %226
226: ; preds = %157, %224
%227 = phi i64 [ %158, %157 ], [ %163, %224 ]
br label %228
228: ; preds = %226, %228
%229 = phi i64 [ %233, %228 ], [ %227, %226 ]
%230 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 0, i64 %229
store i32 -1, i32* %230
%231 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 1, i64 %229
store i32 -1, i32* %231
%232 = getelementptr inbounds [3 x [6 x i32]], [3 x [6 x i32]]* %7, i64 0, i64 2, i64 %229
store i32 -1, i32* %232
%233 = add nuw nsw i64 %229, 1
%234 = icmp eq i64 %233, 6
br i1 %234, label %235, label %228
235: ; preds = %228, %224
%236 = load i32, i32* %100
%237 = load i32, i32* %106
%238 = load i32, i32* %112
br label %239
239: ; preds = %235, %154
%240 = phi i32 [ %238, %235 ], [ %113, %154 ]
%241 = phi i32 [ %237, %235 ], [ %107, %154 ]
%242 = phi i32 [ %236, %235 ], [ %101, %154 ]
%243 = icmp eq i32 %242, -1
%244 = icmp eq i32 %241, -1
%245 = select i1 %243, i1 true, i1 %244
%246 = icmp eq i32 %240, -1
%247 = select i1 %245, i1 true, i1 %246
br i1 %247, label %248, label %250
248: ; preds = %239
%249 = tail call i32 (i8*, ...) @warn(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.12, i64 0, i64 0), i8* %0, i32 %1)
br label %250
250: ; preds = %239, %248
%251 = load i32, i32* %102
%252 = icmp eq i32 %251, -1
%253 = load i32, i32* %108
%254 = icmp eq i32 %253, -1
%255 = select i1 %252, i1 true, i1 %254
%256 = load i32, i32* %114
%257 = icmp eq i32 %256, -1
%258 = select i1 %255, i1 true, i1 %257
br i1 %258, label %259, label %261
259: ; preds = %250
%260 = tail call i32 (i8*, ...) @warn(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.13, i64 0, i64 0), i8* %0, i32 %1)
br label %261
261: ; preds = %39, %259, %250, %144, %137, %128, %123, %17
%262 = phi i32 [ 0, %123 ], [ 0, %17 ], [ 0, %128 ], [ 0, %137 ], [ 0, %144 ], [ 1, %250 ], [ 1, %259 ], [ 0, %39 ]
ret i32 %262
}