#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 option {
  char *name;
  scalar_t__ has_arg;
  int val;
  int *flag;
};

/* Variables and functions */
int /*<<< orphan*/ __getopt_msg(char *const, char *, char *const,
                                int /*<<< orphan*/);
int getopt(int, char *const *, char const *);
char *optarg;
scalar_t__ opterr;
size_t optind;
int optopt;
scalar_t__ required_argument;
int /*<<< orphan*/ strlen(char *const);
int __getopt_long_core(int argc, char *const *argv, const char *optstring,
                       const struct option *longopts, int *idx, int longonly) {
  optarg = 0;
  if (longopts && argv[optind][0] == '-' &&
      ((longonly && argv[optind][1] && argv[optind][1] != '-') ||
       (argv[optind][1] == '-' && argv[optind][2]))) {
    int colon = optstring[optstring[0] == '+' || optstring[0] == '-'] == ':';
    int i, cnt, match;
    char *opt;
    for (cnt = i = 0; longopts[i].name; i++) {
      const char *name = longopts[i].name;
      opt = argv[optind] + 1;
      if (*opt == '-')
        opt++;
      for (; *name && *name == *opt; name++, opt++)
        ;
      if (*opt && *opt != '=')
        continue;
      match = i;
      if (!*name) {
        cnt = 1;
        break;
      }
      cnt++;
    }
    if (cnt == 1) {
      i = match;
      optind++;
      if (*opt == '=') {
        if (!longopts[i].has_arg) {
          optopt = longopts[i].val;
          if (colon || !opterr)
            return '?';
          __getopt_msg(argv[0],
                       ": option does not take an argument: ", longopts[i].name,
                       strlen(longopts[i].name));
          return '?';
        }
        optarg = opt + 1;
      } else if (longopts[i].has_arg == required_argument) {
        if (!(optarg = argv[optind])) {
          optopt = longopts[i].val;
          if (colon)
            return ':';
          if (!opterr)
            return '?';
          __getopt_msg(argv[0],
                       ": option requires an argument: ", longopts[i].name,
                       strlen(longopts[i].name));
          return '?';
        }
        optind++;
      }
      if (idx)
        *idx = i;
      if (longopts[i].flag) {
        *longopts[i].flag = longopts[i].val;
        return 0;
      }
      return longopts[i].val;
    }
    if (argv[optind][1] == '-') {
      optopt = 0;
      if (!colon && opterr)
        __getopt_msg(argv[0],
                     cnt ? ": option is ambiguous: "
                         : ": unrecognized option: ",
                     argv[optind] + 2, strlen(argv[optind] + 2));
      optind++;
      return '?';
    }
  }
  return getopt(argc, argv, optstring);
}


x86 assembly (clang, -O0):
<__getopt_long_core>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
mov    0x2e9f(%rip),%rax
movq   $0x0,(%rax)
cmpq   $0x0,-0x20(%rbp)
je     1713 <__getopt_long_core+0x5e3>
mov    -0x10(%rbp),%rax
mov    0x2e62(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1713 <__getopt_long_core+0x5e3>
cmpl   $0x0,-0x2c(%rbp)
je     11d1 <__getopt_long_core+0xa1>
mov    -0x10(%rbp),%rax
mov    0x2e3a(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
je     11d1 <__getopt_long_core+0xa1>
mov    -0x10(%rbp),%rax
mov    0x2e1b(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2d,%eax
jne    120f <__getopt_long_core+0xdf>
mov    -0x10(%rbp),%rax
mov    0x2dfc(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2d,%eax
jne    1713 <__getopt_long_core+0x5e3>
mov    -0x10(%rbp),%rax
mov    0x2ddd(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
je     1713 <__getopt_long_core+0x5e3>
mov    -0x18(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x2b,%ecx
mov    %al,-0x51(%rbp)
je     123c <__getopt_long_core+0x10c>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
sete   %al
mov    %al,-0x51(%rbp)
mov    -0x60(%rbp),%rax
mov    -0x51(%rbp),%cl
and    $0x1,%cl
movzbl %cl,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x3a,%eax
sete   %al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
cmpq   $0x0,(%rax)
je     138e <__getopt_long_core+0x25e>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    (%rax),%rax
mov    %rax,-0x50(%rbp)
mov    -0x10(%rbp),%rax
mov    0x2d32(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    12d1 <__getopt_long_core+0x1a1>
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    12d6 <__getopt_long_core+0x1a6>
mov    -0x50(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x61(%rbp)
je     1301 <__getopt_long_core+0x1d1>
mov    -0x50(%rbp),%rax
movsbl (%rax),%eax
mov    -0x48(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
sete   %al
mov    %al,-0x61(%rbp)
mov    -0x61(%rbp),%al
test   $0x1,%al
jne    1311 <__getopt_long_core+0x1e1>
jmp    1333 <__getopt_long_core+0x203>
jmp    1316 <__getopt_long_core+0x1e6>
mov    -0x50(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x50(%rbp)
mov    -0x48(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
jmp    12d6 <__getopt_long_core+0x1a6>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1358 <__getopt_long_core+0x228>
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3d,%eax
je     1358 <__getopt_long_core+0x228>
jmp    1380 <__getopt_long_core+0x250>
mov    -0x34(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x50(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1377 <__getopt_long_core+0x247>
movl   $0x1,-0x38(%rbp)
jmp    138e <__getopt_long_core+0x25e>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    126c <__getopt_long_core+0x13c>
cmpl   $0x1,-0x38(%rbp)
jne    1622 <__getopt_long_core+0x4f2>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    0x2c33(%rip),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    0x2c25(%rip),%rax
mov    %rcx,(%rax)
mov    -0x48(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3d,%eax
jne    1493 <__getopt_long_core+0x363>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
cmpq   $0x0,0x8(%rax)
jne    147c <__getopt_long_core+0x34c>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    0x10(%rax),%ecx
mov    0x2be7(%rip),%rax
mov    %ecx,(%rax)
cmpl   $0x0,-0x30(%rbp)
jne    1416 <__getopt_long_core+0x2e6>
mov    0x2bb4(%rip),%rax
cmpq   $0x0,(%rax)
jne    1422 <__getopt_long_core+0x2f2>
movl   $0x3f,-0x4(%rbp)
jmp    1726 <__getopt_long_core+0x5f6>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x78(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    (%rax),%rax
mov    %rax,-0x70(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    (%rax),%rdi
call   1040 <strlen@plt>
mov    -0x78(%rbp),%rdi
mov    -0x70(%rbp),%rdx
mov    %eax,%ecx
lea    0xb95(%rip),%rsi
call   1030 <__getopt_msg@plt>
movl   $0x3f,-0x4(%rbp)
jmp    1726 <__getopt_long_core+0x5f6>
mov    -0x48(%rbp),%rcx
add    $0x1,%rcx
mov    0x2b6d(%rip),%rax
mov    %rcx,(%rax)
jmp    15a7 <__getopt_long_core+0x477>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    0x8(%rax),%rax
mov    0x2b23(%rip),%rcx
cmp    (%rcx),%rax
jne    15a2 <__getopt_long_core+0x472>
mov    -0x10(%rbp),%rax
mov    0x2b17(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
mov    0x2b29(%rip),%rcx
mov    %rax,(%rcx)
cmp    $0x0,%rax
jne    158a <__getopt_long_core+0x45a>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    0x10(%rax),%ecx
mov    0x2aeb(%rip),%rax
mov    %ecx,(%rax)
cmpl   $0x0,-0x30(%rbp)
je     150d <__getopt_long_core+0x3dd>
movl   $0x3a,-0x4(%rbp)
jmp    1726 <__getopt_long_core+0x5f6>
mov    0x2aac(%rip),%rax
cmpq   $0x0,(%rax)
jne    152a <__getopt_long_core+0x3fa>
movl   $0x3f,-0x4(%rbp)
jmp    1726 <__getopt_long_core+0x5f6>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x88(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    (%rax),%rax
mov    %rax,-0x80(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    (%rax),%rdi
call   1040 <strlen@plt>
mov    -0x88(%rbp),%rdi
mov    -0x80(%rbp),%rdx
mov    %eax,%ecx
lea    0xaac(%rip),%rsi
call   1030 <__getopt_msg@plt>
movl   $0x3f,-0x4(%rbp)
jmp    1726 <__getopt_long_core+0x5f6>
mov    0x2a47(%rip),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    0x2a39(%rip),%rax
mov    %rcx,(%rax)
jmp    15a7 <__getopt_long_core+0x477>
cmpq   $0x0,-0x28(%rbp)
je     15bb <__getopt_long_core+0x48b>
mov    -0x34(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
cmpq   $0x0,0x18(%rax)
je     1608 <__getopt_long_core+0x4d8>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    0x10(%rax),%ecx
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rdx
shl    $0x5,%rdx
add    %rdx,%rax
mov    0x18(%rax),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    1726 <__getopt_long_core+0x5f6>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
shl    $0x5,%rcx
add    %rcx,%rax
mov    0x10(%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1726 <__getopt_long_core+0x5f6>
mov    -0x10(%rbp),%rax
mov    0x29ab(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2d,%eax
jne    170e <__getopt_long_core+0x5de>
mov    0x2998(%rip),%rax
movl   $0x0,(%rax)
cmpl   $0x0,-0x30(%rbp)
jne    16ea <__getopt_long_core+0x5ba>
mov    0x2961(%rip),%rax
cmpq   $0x0,(%rax)
je     16ea <__getopt_long_core+0x5ba>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x38(%rbp),%edx
lea    0x9dc(%rip),%rax
lea    0x9bd(%rip),%rcx
cmp    $0x0,%edx
cmovne %rcx,%rax
mov    %rax,-0x98(%rbp)
mov    -0x10(%rbp),%rax
mov    0x2937(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
add    $0x2,%rax
mov    %rax,-0x90(%rbp)
mov    -0x10(%rbp),%rax
mov    0x291a(%rip),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rdi
add    $0x2,%rdi
call   1040 <strlen@plt>
mov    -0xa0(%rbp),%rdi
mov    -0x98(%rbp),%rsi
mov    -0x90(%rbp),%rdx
mov    %eax,%ecx
call   1030 <__getopt_msg@plt>
mov    0x28e7(%rip),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    0x28d9(%rip),%rax
mov    %rcx,(%rax)
movl   $0x3f,-0x4(%rbp)
jmp    1726 <__getopt_long_core+0x5f6>
jmp    1713 <__getopt_long_core+0x5e3>
mov    -0x8(%rbp),%edi
mov    -0x10(%rbp),%rsi
mov    -0x18(%rbp),%rdx
call   1050 <getopt@plt>
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<__getopt_long_core>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    0x2eb3(%rip),%rax
movq   $0x0,(%rax)
test   %rcx,%rcx
je     1346 <__getopt_long_core+0x216>
mov    0x2e7c(%rip),%r14
mov    (%r14),%rax
mov    (%rsi,%rax,8),%r13
cmpb   $0x2d,0x0(%r13)
jne    1346 <__getopt_long_core+0x216>
mov    0x1(%r13),%bl
test   %r9d,%r9d
je     1186 <__getopt_long_core+0x56>
test   %bl,%bl
je     1346 <__getopt_long_core+0x216>
cmp    $0x2d,%bl
je     118f <__getopt_long_core+0x5f>
jmp    119c <__getopt_long_core+0x6c>
cmp    $0x2d,%bl
jne    1346 <__getopt_long_core+0x216>
mov    $0x2d,%bl
cmpb   $0x0,0x2(%r13)
je     1346 <__getopt_long_core+0x216>
mov    %rax,0x10(%rsp)
mov    (%rdx),%al
add    $0xd5,%al
and    $0xfd,%al
cmp    $0x1,%al
mov    %rdx,%rax
adc    $0x0,%rax
mov    (%rax),%r9b
mov    (%rcx),%r12
test   %r12,%r12
mov    %bl,0x7(%rsp)
je     126f <__getopt_long_core+0x13f>
mov    %r9b,0x6(%rsp)
mov    %r8,0x8(%rsp)
xor    %eax,%eax
cmp    $0x2d,%bl
sete   %al
lea    (%rax,%r13,1),%r9
add    $0x1,%r9
xor    %ebx,%ebx
xor    %r11d,%r11d
jmp    1213 <__getopt_long_core+0xe3>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
test   %al,%al
jne    1274 <__getopt_long_core+0x144>
add    $0x1,%r11d
mov    %ebx,%r15d
add    $0x1,%rbx
mov    %rbx,%rax
shl    $0x5,%rax
mov    (%rcx,%rax,1),%r12
test   %r12,%r12
je     127d <__getopt_long_core+0x14d>
mov    (%r12),%r10b
mov    %r9,%rbp
test   %r10b,%r10b
je     124c <__getopt_long_core+0x11c>
add    $0x1,%r12
mov    %r9,%rbp
cs nopw 0x0(%rax,%rax,1)
movzbl 0x0(%rbp),%r8d
cmp    %r8b,%r10b
jne    1260 <__getopt_long_core+0x130>
add    $0x1,%rbp
movzbl (%r12),%r10d
add    $0x1,%r12
test   %r10b,%r10b
jne    1230 <__getopt_long_core+0x100>
mov    0x0(%rbp),%r8b
mov    $0x1,%al
cmp    $0x3d,%r8b
jne    1268 <__getopt_long_core+0x138>
jmp    11f0 <__getopt_long_core+0xc0>
nopw   0x0(%rax,%rax,1)
xor    %eax,%eax
cmp    $0x3d,%r8b
je     11f0 <__getopt_long_core+0xc0>
test   %r8b,%r8b
je     11f0 <__getopt_long_core+0xc0>
jmp    11ff <__getopt_long_core+0xcf>
xor    %r11d,%r11d
jmp    12d2 <__getopt_long_core+0x1a2>
mov    $0x1,%r11d
mov    %ebx,%r15d
cmp    $0x1,%r11d
mov    0x2d50(%rip),%r14
mov    0x6(%rsp),%r9b
jne    12d2 <__getopt_long_core+0x1a2>
mov    0x10(%rsp),%rbx
lea    0x1(%rbx),%rax
mov    %rax,(%r14)
movslq %r15d,%rax
shl    $0x5,%rax
cmpb   $0x3d,0x0(%rbp)
mov    0x8(%rcx,%rax,1),%rdx
jne    1359 <__getopt_long_core+0x229>
test   %rdx,%rdx
je     13a9 <__getopt_long_core+0x279>
add    $0x1,%rbp
mov    0x2d33(%rip),%rdx
mov    %rbp,(%rdx)
mov    0x8(%rsp),%rdi
jmp    1386 <__getopt_long_core+0x256>
cmpb   $0x2d,0x7(%rsp)
mov    0x10(%rsp),%rcx
jne    1346 <__getopt_long_core+0x216>
mov    0x2cfb(%rip),%rax
movl   $0x0,(%rax)
cmp    $0x3a,%r9b
je     1335 <__getopt_long_core+0x205>
mov    0x2cc8(%rip),%rax
cmpq   $0x0,(%rax)
je     1335 <__getopt_long_core+0x205>
mov    (%rsi),%rbx
test   %r11d,%r11d
lea    0xd52(%rip),%rax
lea    0xd33(%rip),%r15
cmove  %rax,%r15
add    $0x2,%r13
mov    %r13,%rdi
call   1040 <strlen@plt>
mov    %rbx,%rdi
mov    %r15,%rsi
mov    %r13,%rdx
mov    %eax,%ecx
call   1030 <__getopt_msg@plt>
mov    (%r14),%rcx
add    $0x1,%rcx
mov    %rcx,(%r14)
mov    $0x3f,%ebx
jmp    1433 <__getopt_long_core+0x303>
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1050 <getopt@plt>
mov    0x2c70(%rip),%rdi
cmp    (%rdi),%rdx
mov    0x8(%rsp),%rdi
jne    1386 <__getopt_long_core+0x256>
mov    0x8(%rsi,%rbx,8),%rdx
mov    0x2c82(%rip),%rbp
mov    %rdx,0x0(%rbp)
test   %rdx,%rdx
je     13e6 <__getopt_long_core+0x2b6>
add    $0x2,%rbx
mov    %rbx,(%r14)
test   %rdi,%rdi
je     138e <__getopt_long_core+0x25e>
mov    %r15d,(%rdi)
mov    0x18(%rcx,%rax,1),%rdx
mov    0x10(%rcx,%rax,1),%ebx
test   %rdx,%rdx
je     1433 <__getopt_long_core+0x303>
mov    %ebx,(%rdx)
xor    %ebx,%ebx
jmp    1433 <__getopt_long_core+0x303>
mov    0x10(%rcx,%rax,1),%edx
mov    0x2c2c(%rip),%rdi
mov    %edx,(%rdi)
mov    $0x3f,%ebx
cmp    $0x3a,%r9b
je     1433 <__getopt_long_core+0x303>
mov    0x2bf8(%rip),%rdx
cmpq   $0x0,(%rdx)
je     1433 <__getopt_long_core+0x303>
mov    (%rsi),%r14
mov    (%rcx,%rax,1),%r15
mov    %r15,%rdi
call   1040 <strlen@plt>
lea    0xc1c(%rip),%rsi
jmp    1426 <__getopt_long_core+0x2f6>
mov    0x10(%rcx,%rax,1),%edx
mov    0x2bef(%rip),%rdi
mov    %edx,(%rdi)
mov    $0x3a,%ebx
cmp    $0x3a,%r9b
je     1433 <__getopt_long_core+0x303>
mov    0x2bbb(%rip),%rdx
mov    $0x3f,%ebx
cmpq   $0x0,(%rdx)
je     1433 <__getopt_long_core+0x303>
mov    (%rsi),%r14
mov    (%rcx,%rax,1),%r15
mov    %r15,%rdi
call   1040 <strlen@plt>
lea    0xbff(%rip),%rsi
mov    %r14,%rdi
mov    %r15,%rdx
mov    %eax,%ecx
call   1030 <__getopt_msg@plt>
mov    %ebx,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
%struct.option = type { i8*, i64, i32, i32* }
@optarg = global i8* null
@optind = global i64 0
@optopt = global i32 0
@opterr = global i64 0
@.str = [37 x i8] c": option does not take an argument: \00"
@required_argument = global i64 0
@.str.1 = [32 x i8] c": option requires an argument: \00"
@.str.2 = [24 x i8] c": option is ambiguous: \00"
@.str.3 = [24 x i8] c": unrecognized option: \00"
define i32 @__getopt_long_core(i32 %0, i8** %1, i8* %2, %struct.option* %3, i32* writeonly %4, i32 %5) {
store i8* null, i8** @optarg
%7 = icmp eq %struct.option* %3, null
br i1 %7, label %158, label %8
8: ; preds = %6
%9 = load i64, i64* @optind
%10 = getelementptr inbounds i8*, i8** %1, i64 %9
%11 = load i8*, i8** %10
%12 = load i8, i8* %11
%13 = icmp eq i8 %12, 45
br i1 %13, label %14, label %158
14: ; preds = %8
%15 = icmp eq i32 %5, 0
%16 = getelementptr inbounds i8, i8* %11, i64 1
%17 = load i8, i8* %16
br i1 %15, label %19, label %18
18: ; preds = %14
switch i8 %17, label %25 [
i8 45, label %21
i8 0, label %158
]
19: ; preds = %14
%20 = icmp eq i8 %17, 45
br i1 %20, label %21, label %158
21: ; preds = %18, %19
%22 = getelementptr inbounds i8, i8* %11, i64 2
%23 = load i8, i8* %22
%24 = icmp eq i8 %23, 0
br i1 %24, label %158, label %25
25: ; preds = %18, %21
%26 = phi i8 [ %17, %18 ], [ 45, %21 ]
%27 = load i8, i8* %2
%28 = icmp eq i8 %27, 43
%29 = icmp eq i8 %27, 45
%30 = or i1 %28, %29
%31 = zext i1 %30 to i64
%32 = getelementptr inbounds i8, i8* %2, i64 %31
%33 = load i8, i8* %32
%34 = icmp eq i8 %33, 58
%35 = getelementptr inbounds %struct.option, %struct.option* %3, i64 0, i32 0
%36 = load i8*, i8** %35
%37 = icmp eq i8* %36, null
br i1 %37, label %139, label %38
38: ; preds = %25
%39 = icmp eq i8 %26, 45
%40 = select i1 %39, i64 2, i64 1
%41 = getelementptr inbounds i8, i8* %11, i64 %40
br label %42
42: ; preds = %38, %70
%43 = phi i64 [ 0, %38 ], [ %73, %70 ]
%44 = phi i8* [ %36, %38 ], [ %75, %70 ]
%45 = phi i32 [ undef, %38 ], [ %71, %70 ]
%46 = phi i32 [ 0, %38 ], [ %72, %70 ]
%47 = load i8, i8* %44
%48 = icmp eq i8 %47, 0
br i1 %48, label %60, label %49
49: ; preds = %42, %55
%50 = phi i8 [ %58, %55 ], [ %47, %42 ]
%51 = phi i8* [ %56, %55 ], [ %44, %42 ]
%52 = phi i8* [ %57, %55 ], [ %41, %42 ]
%53 = load i8, i8* %52
%54 = icmp eq i8 %50, %53
br i1 %54, label %55, label %63
55: ; preds = %49
%56 = getelementptr inbounds i8, i8* %51, i64 1
%57 = getelementptr inbounds i8, i8* %52, i64 1
%58 = load i8, i8* %56
%59 = icmp eq i8 %58, 0
br i1 %59, label %60, label %49
60: ; preds = %55, %42
%61 = phi i8* [ %41, %42 ], [ %57, %55 ]
%62 = load i8, i8* %61
br label %63
63: ; preds = %49, %60
%64 = phi i8* [ %61, %60 ], [ %52, %49 ]
%65 = phi i1 [ true, %60 ], [ false, %49 ]
%66 = phi i8 [ %62, %60 ], [ %53, %49 ]
switch i8 %66, label %70 [
i8 0, label %67
i8 61, label %67
]
67: ; preds = %63, %63
%68 = add nsw i32 %46, 1
%69 = trunc i64 %43 to i32
br i1 %65, label %77, label %70
70: ; preds = %63, %67
%71 = phi i32 [ %69, %67 ], [ %45, %63 ]
%72 = phi i32 [ %68, %67 ], [ %46, %63 ]
%73 = add nuw i64 %43, 1
%74 = getelementptr inbounds %struct.option, %struct.option* %3, i64 %73, i32 0
%75 = load i8*, i8** %74
%76 = icmp eq i8* %75, null
br i1 %76, label %79, label %42
77: ; preds = %67
%78 = trunc i64 %43 to i32
br label %79
79: ; preds = %70, %77
%80 = phi i32 [ 1, %77 ], [ %72, %70 ]
%81 = phi i32 [ %78, %77 ], [ %71, %70 ]
%82 = icmp eq i32 %80, 1
br i1 %82, label %83, label %139
83: ; preds = %79
%84 = add i64 %9, 1
store i64 %84, i64* @optind
%85 = load i8, i8* %64
%86 = icmp eq i8 %85, 61
%87 = sext i32 %81 to i64
%88 = getelementptr inbounds %struct.option, %struct.option* %3, i64 %87, i32 1
%89 = load i64, i64* %88
br i1 %86, label %90, label %107
90: ; preds = %83
%91 = icmp eq i64 %89, 0
br i1 %91, label %92, label %105
92: ; preds = %90
%93 = getelementptr inbounds %struct.option, %struct.option* %3, i64 %87, i32 2
%94 = load i32, i32* %93
store i32 %94, i32* @optopt
%95 = xor i1 %34, true
%96 = load i64, i64* @opterr
%97 = icmp ne i64 %96, 0
%98 = select i1 %95, i1 %97, i1 false
br i1 %98, label %99, label %160
99: ; preds = %92
%100 = load i8*, i8** %1
%101 = getelementptr inbounds %struct.option, %struct.option* %3, i64 %87, i32 0
%102 = load i8*, i8** %101
%103 = tail call i32 @strlen(i8* %102)
%104 = tail call i32 @__getopt_msg(i8* %100, i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str, i64 0, i64 0), i8* %102, i32 %103)
br label %160
105: ; preds = %90
%106 = getelementptr inbounds i8, i8* %64, i64 1
store i8* %106, i8** @optarg
br label %128
107: ; preds = %83
%108 = load i64, i64* @required_argument
%109 = icmp eq i64 %89, %108
br i1 %109, label %110, label %128
110: ; preds = %107
%111 = getelementptr inbounds i8*, i8** %1, i64 %84
%112 = load i8*, i8** %111
store i8* %112, i8** @optarg
%113 = icmp eq i8* %112, null
br i1 %113, label %114, label %126
114: ; preds = %110
%115 = getelementptr inbounds %struct.option, %struct.option* %3, i64 %87, i32 2
%116 = load i32, i32* %115
store i32 %116, i32* @optopt
br i1 %34, label %160, label %117
117: ; preds = %114
%118 = load i64, i64* @opterr
%119 = icmp eq i64 %118, 0
br i1 %119, label %160, label %120
120: ; preds = %117
%121 = load i8*, i8** %1
%122 = getelementptr inbounds %struct.option, %struct.option* %3, i64 %87, i32 0
%123 = load i8*, i8** %122
%124 = tail call i32 @strlen(i8* %123)
%125 = tail call i32 @__getopt_msg(i8* %121, i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.1, i64 0, i64 0), i8* %123, i32 %124)
br label %160
126: ; preds = %110
%127 = add i64 %9, 2
store i64 %127, i64* @optind
br label %128
128: ; preds = %107, %126, %105
%129 = icmp eq i32* %4, null
br i1 %129, label %131, label %130
130: ; preds = %128
store i32 %81, i32* %4
br label %131
131: ; preds = %130, %128
%132 = sext i32 %81 to i64
%133 = getelementptr inbounds %struct.option, %struct.option* %3, i64 %132, i32 3
%134 = load i32*, i32** %133
%135 = icmp eq i32* %134, null
%136 = getelementptr inbounds %struct.option, %struct.option* %3, i64 %132, i32 2
%137 = load i32, i32* %136
br i1 %135, label %160, label %138
138: ; preds = %131
store i32 %137, i32* %134
br label %160
139: ; preds = %25, %79
%140 = phi i32 [ %80, %79 ], [ 0, %25 ]
%141 = icmp eq i8 %26, 45
br i1 %141, label %142, label %158
142: ; preds = %139
store i32 0, i32* @optopt
%143 = xor i1 %34, true
%144 = load i64, i64* @opterr
%145 = icmp ne i64 %144, 0
%146 = select i1 %143, i1 %145, i1 false
br i1 %146, label %147, label %155
147: ; preds = %142
%148 = load i8*, i8** %1
%149 = icmp eq i32 %140, 0
%150 = select i1 %149, i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.2, i64 0, i64 0)
%151 = getelementptr inbounds i8, i8* %11, i64 2
%152 = tail call i32 @strlen(i8* %151)
%153 = tail call i32 @__getopt_msg(i8* %148, i8* %150, i8* %151, i32 %152)
%154 = load i64, i64* @optind
br label %155
155: ; preds = %147, %142
%156 = phi i64 [ %154, %147 ], [ %9, %142 ]
%157 = add i64 %156, 1
store i64 %157, i64* @optind
br label %160
158: ; preds = %18, %139, %21, %19, %8, %6
%159 = tail call i32 @getopt(i32 %0, i8** %1, i8* %2)
br label %160
160: ; preds = %131, %117, %114, %92, %155, %120, %99, %138, %158
%161 = phi i32 [ %159, %158 ], [ 63, %117 ], [ 58, %114 ], [ 63, %92 ], [ 63, %155 ], [ 63, %120 ], [ 63, %99 ], [ 0, %138 ], [ %137, %131 ]
ret i32 %161
}