#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 */
scalar_t__ calloc(int, size_t);
int /*<<< orphan*/ check_alloc(char *);
int /*<<< orphan*/ check_float(char *, int);
int /*<<< orphan*/ check_integer(char *, int);
char check_optional(char *, int);
int /*<<< orphan*/ check_three(char *, int);
int /*<<< orphan*/ check_two(char *, int);
int /*<<< orphan*/ check_unsigned(char *, int);
int /*<<< orphan*/ exit(int);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *, int);
int /*<<< orphan*/ free(char *);
int /*<<< orphan*/ stderr;
int /*<<< orphan*/ strcpy(char *, char *);
int strlen(char *);
char *check_option(char **in, int n, int which, int type) {
  char test, *ret = NULL, wasfound = 0, ok = 1;
  int i;
  for (i = 1; i < n; i++) {
    if (in[i] != NULL) {
      test = (in[i][0] == '-') && (in[i][1] == which);
      if (test) {
        wasfound = 1;
        if (type != 'n') {
          if (strlen(in[i]) > 2) {
            switch (type) {
            case 'u':
              check_unsigned(in[i] + 2, which);
              break;
            case 'd':
              check_integer(in[i] + 2, which);
              break;
            case 'f':
              check_float(in[i] + 2, which);
              break;
            case '2':
              check_two(in[i] + 2, which);
              break;
            case '3':
              check_three(in[i] + 2, which);
              break;
            }
            if (ret != NULL)
              free(ret);
            check_alloc(ret = (char *)calloc(strlen(in[i] + 2) + 1, (size_t)1));
            strcpy(ret, in[i] + 2);
            in[i] = NULL;
          } else {
            in[i] = NULL;
            i++;
            if (i < n) {
              if (in[i] != NULL) {
                switch (type) {
                case 'u':
                  check_unsigned(in[i], which);
                  break;
                case 'd':
                  check_integer(in[i], which);
                  break;
                case 'f':
                  check_float(in[i], which);
                  break;
                case '2':
                  check_two(in[i], which);
                  break;
                case '3':
                  check_three(in[i] + 2, which);
                  break;
                case 'o':
                  ok = check_optional(in[i], which);
                  break;
                }
                if (ok) {
                  if (ret != NULL)
                    free(ret);
                  check_alloc(ret =
                                  (char *)calloc(strlen(in[i]) + 1, (size_t)1));
                  strcpy(ret, in[i]);
                  in[i] = NULL;
                } else {
                  i--;
                  if (ret != NULL)
                    free(ret);
                  ret = NULL;
                }
              }
            } else {
              if (ret != NULL) {
                free(ret);
                ret = NULL;
              }
            }
          }
        } else {
          in[i] = NULL;
        }
      }
    }
  }
  if (((type == 'o') || (type == 'n')) && (ret == NULL) && wasfound)
    return "";
  if (wasfound && (ret == NULL)) {
    fprintf(stderr, "The option -%c needs some value. Exiting!\n", which);
    exit(6);
  }
  return ret;
}


x86 assembly (clang, -O0):
<check_option>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movq   $0x0,-0x28(%rbp)
movb   $0x0,-0x29(%rbp)
movb   $0x1,-0x2a(%rbp)
movl   $0x1,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1618 <check_option+0x448>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
je     1605 <check_option+0x435>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2d,%ecx
mov    %al,-0x31(%rbp)
jne    1251 <check_option+0x81>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl 0x1(%rax),%eax
cmp    -0x18(%rbp),%eax
sete   %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %al,-0x1d(%rbp)
cmpb   $0x0,-0x1d(%rbp)
je     1600 <check_option+0x430>
movb   $0x1,-0x29(%rbp)
cmpl   $0x6e,-0x1c(%rbp)
je     15eb <check_option+0x41b>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1070 <strlen@plt>
cmp    $0x2,%eax
jle    13e4 <check_option+0x214>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x38(%rbp)
sub    $0x32,%eax
je     133d <check_option+0x16d>
jmp    12a2 <check_option+0xd2>
mov    -0x38(%rbp),%eax
sub    $0x33,%eax
je     135a <check_option+0x18a>
jmp    12b3 <check_option+0xe3>
mov    -0x38(%rbp),%eax
sub    $0x64,%eax
je     1303 <check_option+0x133>
jmp    12c4 <check_option+0xf4>
mov    -0x38(%rbp),%eax
sub    $0x66,%eax
je     1320 <check_option+0x150>
jmp    12d5 <check_option+0x105>
mov    -0x38(%rbp),%eax
sub    $0x75,%eax
jne    1372 <check_option+0x1a2>
jmp    12e6 <check_option+0x116>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
add    $0x2,%rdi
mov    -0x18(%rbp),%esi
call   1030 <check_unsigned@plt>
jmp    1372 <check_option+0x1a2>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
add    $0x2,%rdi
mov    -0x18(%rbp),%esi
call   1080 <check_integer@plt>
jmp    1372 <check_option+0x1a2>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
add    $0x2,%rdi
mov    -0x18(%rbp),%esi
call   1050 <check_float@plt>
jmp    1372 <check_option+0x1a2>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
add    $0x2,%rdi
mov    -0x18(%rbp),%esi
call   10e0 <check_two@plt>
jmp    1372 <check_option+0x1a2>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
add    $0x2,%rdi
mov    -0x18(%rbp),%esi
call   10b0 <check_three@plt>
cmpq   $0x0,-0x28(%rbp)
je     1386 <check_option+0x1b6>
mov    -0x28(%rbp),%rdi
call   1040 <free@plt>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
add    $0x2,%rdi
call   1070 <strlen@plt>
mov    %eax,%edi
add    $0x1,%edi
mov    $0x1,%esi
call   1090 <calloc@plt>
mov    %rax,%rdi
mov    %rdi,-0x28(%rbp)
call   10f0 <check_alloc@plt>
mov    -0x28(%rbp),%rdi
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rsi
add    $0x2,%rsi
call   1060 <strcpy@plt>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
jmp    15e6 <check_option+0x416>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    15c0 <check_option+0x3f0>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
je     15bb <check_option+0x3eb>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
sub    $0x32,%eax
je     14d0 <check_option+0x300>
jmp    1430 <check_option+0x260>
mov    -0x3c(%rbp),%eax
sub    $0x33,%eax
je     14e9 <check_option+0x319>
jmp    1441 <check_option+0x271>
mov    -0x3c(%rbp),%eax
sub    $0x64,%eax
je     149e <check_option+0x2ce>
jmp    1452 <check_option+0x282>
mov    -0x3c(%rbp),%eax
sub    $0x66,%eax
je     14b7 <check_option+0x2e7>
jmp    1463 <check_option+0x293>
mov    -0x3c(%rbp),%eax
sub    $0x6f,%eax
je     1506 <check_option+0x336>
jmp    1474 <check_option+0x2a4>
mov    -0x3c(%rbp),%eax
sub    $0x75,%eax
jne    151d <check_option+0x34d>
jmp    1485 <check_option+0x2b5>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
mov    -0x18(%rbp),%esi
call   1030 <check_unsigned@plt>
jmp    151d <check_option+0x34d>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
mov    -0x18(%rbp),%esi
call   1080 <check_integer@plt>
jmp    151d <check_option+0x34d>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
mov    -0x18(%rbp),%esi
call   1050 <check_float@plt>
jmp    151d <check_option+0x34d>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
mov    -0x18(%rbp),%esi
call   10e0 <check_two@plt>
jmp    151d <check_option+0x34d>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
add    $0x2,%rdi
mov    -0x18(%rbp),%esi
call   10b0 <check_three@plt>
jmp    151d <check_option+0x34d>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
mov    -0x18(%rbp),%esi
call   10c0 <check_optional@plt>
mov    %al,-0x2a(%rbp)
cmpb   $0x0,-0x2a(%rbp)
je     1591 <check_option+0x3c1>
cmpq   $0x0,-0x28(%rbp)
je     153b <check_option+0x36b>
mov    -0x28(%rbp),%rdi
call   1040 <free@plt>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1070 <strlen@plt>
mov    %eax,%edi
add    $0x1,%edi
mov    $0x1,%esi
call   1090 <calloc@plt>
mov    %rax,%rdi
mov    %rdi,-0x28(%rbp)
call   10f0 <check_alloc@plt>
mov    -0x28(%rbp),%rdi
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rsi
call   1060 <strcpy@plt>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
jmp    15b6 <check_option+0x3e6>
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
cmpq   $0x0,-0x28(%rbp)
je     15ae <check_option+0x3de>
mov    -0x28(%rbp),%rdi
call   1040 <free@plt>
movq   $0x0,-0x28(%rbp)
jmp    15bb <check_option+0x3eb>
jmp    15e1 <check_option+0x411>
cmpq   $0x0,-0x28(%rbp)
je     15dc <check_option+0x40c>
mov    -0x28(%rbp),%rdi
call   1040 <free@plt>
movq   $0x0,-0x28(%rbp)
jmp    15e1 <check_option+0x411>
jmp    15e6 <check_option+0x416>
jmp    15fb <check_option+0x42b>
mov    -0x10(%rbp),%rax
movslq -0x30(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
jmp    1600 <check_option+0x430>
jmp    1605 <check_option+0x435>
jmp    160a <check_option+0x43a>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    11fc <check_option+0x2c>
cmpl   $0x6f,-0x1c(%rbp)
je     162c <check_option+0x45c>
cmpl   $0x6e,-0x1c(%rbp)
jne    1654 <check_option+0x484>
cmpq   $0x0,-0x28(%rbp)
jne    1654 <check_option+0x484>
movsbl -0x29(%rbp),%eax
cmp    $0x0,%eax
je     1654 <check_option+0x484>
lea    0x9df(%rip),%rax
mov    %rax,-0x8(%rbp)
jmp    1696 <check_option+0x4c6>
movsbl -0x29(%rbp),%eax
cmp    $0x0,%eax
je     168e <check_option+0x4be>
cmpq   $0x0,-0x28(%rbp)
jne    168e <check_option+0x4be>
mov    0x296d(%rip),%rax
mov    (%rax),%edi
mov    -0x18(%rbp),%edx
lea    0x981(%rip),%rsi
call   10a0 <fprintf@plt>
mov    $0x6,%edi
call   10d0 <exit@plt>
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<check_option>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
cmp    $0x2,%esi
jl     1203 <check_option+0x33>
mov    %ecx,%r15d
mov    %esi,%ebp
mov    %rdi,%rbx
mov    $0x1,%al
mov    %rax,0x8(%rsp)
mov    $0x1,%r13d
xor    %ecx,%ecx
xor    %r12d,%r12d
mov    %edx,0x4(%rsp)
jmp    127d <check_option+0xad>
xor    %r12d,%r12d
jmp    14e0 <check_option+0x310>
mov    (%rbx,%r14,8),%rdi
add    $0x2,%rdi
call   1050 <check_float@plt>
test   %r12,%r12
je     1225 <check_option+0x55>
mov    %r12,%rdi
call   1040 <free@plt>
mov    (%rbx,%r14,8),%rdi
add    $0x2,%rdi
call   1070 <strlen@plt>
lea    0x1(%rax),%edi
mov    $0x1,%esi
call   1090 <calloc@plt>
mov    %rax,%r12
mov    %rax,%rdi
call   10f0 <check_alloc@plt>
mov    (%rbx,%r14,8),%rsi
add    $0x2,%rsi
mov    %r12,%rdi
call   1060 <strcpy@plt>
movq   $0x0,(%rbx,%r14,8)
mov    $0x1,%cl
mov    0x4(%rsp),%edx
nopl   0x0(%rax,%rax,1)
add    $0x1,%r13d
cmp    %ebp,%r13d
jge    14bb <check_option+0x2eb>
movslq %r13d,%r14
mov    (%rbx,%r14,8),%rdi
test   %rdi,%rdi
je     1270 <check_option+0xa0>
cmpb   $0x2d,(%rdi)
jne    1270 <check_option+0xa0>
movsbl 0x1(%rdi),%eax
cmp    %edx,%eax
jne    1270 <check_option+0xa0>
cmp    $0x6e,%r15d
jne    12a8 <check_option+0xd8>
movq   $0x0,(%rbx,%r14,8)
mov    $0x1,%cl
jmp    1270 <check_option+0xa0>
call   1070 <strlen@plt>
cmp    $0x3,%eax
jl     12fd <check_option+0x12d>
cmp    $0x63,%r15d
mov    0x4(%rsp),%esi
jle    1372 <check_option+0x1a2>
cmp    $0x64,%r15d
je     13a9 <check_option+0x1d9>
cmp    $0x66,%r15d
je     120b <check_option+0x3b>
cmp    $0x75,%r15d
jne    1218 <check_option+0x48>
mov    (%rbx,%r14,8),%rdi
add    $0x2,%rdi
mov    0x4(%rsp),%esi
call   1030 <check_unsigned@plt>
test   %r12,%r12
jne    121d <check_option+0x4d>
jmp    1225 <check_option+0x55>
movq   $0x0,(%rbx,%r14,8)
add    $0x1,%r14d
cmp    %ebp,%r14d
jge    134e <check_option+0x17e>
movslq %r14d,%rax
mov    %rax,0x10(%rsp)
mov    (%rbx,%rax,8),%rdi
mov    $0x1,%cl
test   %rdi,%rdi
mov    0x4(%rsp),%edx
je     13a1 <check_option+0x1d1>
lea    -0x64(%r15),%eax
cmp    $0x11,%eax
ja     13df <check_option+0x20f>
lea    0xcc7(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    %edx,%esi
call   1080 <check_integer@plt>
jmp    1490 <check_option+0x2c0>
mov    $0x1,%cl
test   %r12,%r12
mov    0x4(%rsp),%edx
je     1367 <check_option+0x197>
mov    %r12,%rdi
call   1040 <free@plt>
mov    $0x1,%cl
mov    0x4(%rsp),%edx
xor    %r12d,%r12d
mov    %r14d,%r13d
jmp    1270 <check_option+0xa0>
cmp    $0x32,%r15d
je     13c4 <check_option+0x1f4>
cmp    $0x33,%r15d
jne    1218 <check_option+0x48>
mov    (%rbx,%r14,8),%rdi
add    $0x2,%rdi
mov    0x4(%rsp),%esi
call   10b0 <check_three@plt>
test   %r12,%r12
jne    121d <check_option+0x4d>
jmp    1225 <check_option+0x55>
mov    %r14d,%r13d
jmp    1270 <check_option+0xa0>
mov    (%rbx,%r14,8),%rdi
add    $0x2,%rdi
call   1080 <check_integer@plt>
test   %r12,%r12
jne    121d <check_option+0x4d>
jmp    1225 <check_option+0x55>
mov    (%rbx,%r14,8),%rdi
add    $0x2,%rdi
call   10e0 <check_two@plt>
test   %r12,%r12
jne    121d <check_option+0x4d>
jmp    1225 <check_option+0x55>
cmp    $0x32,%r15d
je     1489 <check_option+0x2b9>
cmp    $0x33,%r15d
jne    142f <check_option+0x25f>
add    $0x2,%rdi
mov    %edx,%esi
call   10b0 <check_three@plt>
jmp    1490 <check_option+0x2c0>
mov    %edx,%esi
call   1050 <check_float@plt>
jmp    1490 <check_option+0x2c0>
mov    %edx,%esi
call   10c0 <check_optional@plt>
mov    0x4(%rsp),%edx
mov    %rax,0x8(%rsp)
cmpb   $0x0,0x8(%rsp)
jne    1436 <check_option+0x266>
jmp    149b <check_option+0x2cb>
mov    %edx,%esi
call   1030 <check_unsigned@plt>
mov    0x4(%rsp),%edx
cmpb   $0x0,0x8(%rsp)
je     149b <check_option+0x2cb>
test   %r12,%r12
je     1443 <check_option+0x273>
mov    %r12,%rdi
call   1040 <free@plt>
mov    0x10(%rsp),%r13
mov    (%rbx,%r13,8),%rdi
call   1070 <strlen@plt>
lea    0x1(%rax),%edi
mov    $0x1,%esi
call   1090 <calloc@plt>
mov    %rax,%r12
mov    %rax,%rdi
call   10f0 <check_alloc@plt>
mov    (%rbx,%r13,8),%rsi
mov    %r12,%rdi
call   1060 <strcpy@plt>
movq   $0x0,(%rbx,%r13,8)
mov    %r14d,%r13d
mov    0x4(%rsp),%edx
jmp    12a4 <check_option+0xd4>
mov    %edx,%esi
call   10e0 <check_two@plt>
mov    0x4(%rsp),%edx
cmpb   $0x0,0x8(%rsp)
jne    1436 <check_option+0x266>
test   %r12,%r12
je     14ac <check_option+0x2dc>
mov    %r12,%rdi
call   1040 <free@plt>
mov    0x4(%rsp),%edx
xor    %r12d,%r12d
xor    %eax,%eax
mov    %rax,0x8(%rsp)
jmp    12a4 <check_option+0xd4>
and    $0xfffffffe,%r15d
cmp    $0x6e,%r15d
jne    14d7 <check_option+0x307>
test   %r12,%r12
jne    14d7 <check_option+0x307>
test   %cl,%cl
je     14d7 <check_option+0x307>
lea    0xb9d(%rip),%r12
jmp    14e0 <check_option+0x310>
test   %cl,%cl
je     14e0 <check_option+0x310>
test   %r12,%r12
je     14f2 <check_option+0x322>
mov    %r12,%rax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    0x2ae7(%rip),%rax
mov    (%rax),%edi
lea    0xb46(%rip),%rsi
call   10a0 <fprintf@plt>
mov    $0x6,%edi
call   10d0 <exit@plt>

LLVM IR (-O0):
@.str = [1 x i8] zeroinitializer
@stderr = global i32 0
@.str.1 = [43 x i8] c"The option -%c needs some value. Exiting!\0A\00"
define i8* @check_option(i8** %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i8**
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i8
%11 = alloca i8*
%12 = alloca i8
%13 = alloca i8
%14 = alloca i32
store i8** %0, i8*** %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i8* null, i8** %11
store i8 0, i8* %12
store i8 1, i8* %13
store i32 1, i32* %14
br label %15
15: ; preds = %268, %4
%16 = load i32, i32* %14
%17 = load i32, i32* %7
%18 = icmp slt i32 %16, %17
br i1 %18, label %19, label %271
19: ; preds = %15
%20 = load i8**, i8*** %6
%21 = load i32, i32* %14
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds i8*, i8** %20, i64 %22
%24 = load i8*, i8** %23
%25 = icmp ne i8* %24, null
br i1 %25, label %26, label %267
26: ; preds = %19
%27 = load i8**, i8*** %6
%28 = load i32, i32* %14
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8*, i8** %27, i64 %29
%31 = load i8*, i8** %30
%32 = getelementptr inbounds i8, i8* %31, i64 0
%33 = load i8, i8* %32
%34 = sext i8 %33 to i32
%35 = icmp eq i32 %34, 45
br i1 %35, label %36, label %47
36: ; preds = %26
%37 = load i8**, i8*** %6
%38 = load i32, i32* %14
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8*, i8** %37, i64 %39
%41 = load i8*, i8** %40
%42 = getelementptr inbounds i8, i8* %41, i64 1
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = load i32, i32* %8
%46 = icmp eq i32 %44, %45
br label %47
47: ; preds = %36, %26
%48 = phi i1 [ false, %26 ], [ %46, %36 ]
%49 = zext i1 %48 to i32
%50 = trunc i32 %49 to i8
store i8 %50, i8* %10
%51 = load i8, i8* %10
%52 = icmp ne i8 %51, 0
br i1 %52, label %53, label %266
53: ; preds = %47
store i8 1, i8* %12
%54 = load i32, i32* %9
%55 = icmp ne i32 %54, 110
br i1 %55, label %56, label %260
56: ; preds = %53
%57 = load i8**, i8*** %6
%58 = load i32, i32* %14
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8*, i8** %57, i64 %59
%61 = load i8*, i8** %60
%62 = call i32 @strlen(i8* %61)
%63 = icmp sgt i32 %62, 2
br i1 %63, label %64, label %141
64: ; preds = %56
%65 = load i32, i32* %9
switch i32 %65, label %111 [
i32 117, label %66
i32 100, label %75
i32 102, label %84
i32 50, label %93
i32 51, label %102
]
66: ; preds = %64
%67 = load i8**, i8*** %6
%68 = load i32, i32* %14
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds i8*, i8** %67, i64 %69
%71 = load i8*, i8** %70
%72 = getelementptr inbounds i8, i8* %71, i64 2
%73 = load i32, i32* %8
%74 = call i32 @check_unsigned(i8* %72, i32 %73)
br label %111
75: ; preds = %64
%76 = load i8**, i8*** %6
%77 = load i32, i32* %14
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds i8*, i8** %76, i64 %78
%80 = load i8*, i8** %79
%81 = getelementptr inbounds i8, i8* %80, i64 2
%82 = load i32, i32* %8
%83 = call i32 @check_integer(i8* %81, i32 %82)
br label %111
84: ; preds = %64
%85 = load i8**, i8*** %6
%86 = load i32, i32* %14
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds i8*, i8** %85, i64 %87
%89 = load i8*, i8** %88
%90 = getelementptr inbounds i8, i8* %89, i64 2
%91 = load i32, i32* %8
%92 = call i32 @check_float(i8* %90, i32 %91)
br label %111
93: ; preds = %64
%94 = load i8**, i8*** %6
%95 = load i32, i32* %14
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds i8*, i8** %94, i64 %96
%98 = load i8*, i8** %97
%99 = getelementptr inbounds i8, i8* %98, i64 2
%100 = load i32, i32* %8
%101 = call i32 @check_two(i8* %99, i32 %100)
br label %111
102: ; preds = %64
%103 = load i8**, i8*** %6
%104 = load i32, i32* %14
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds i8*, i8** %103, i64 %105
%107 = load i8*, i8** %106
%108 = getelementptr inbounds i8, i8* %107, i64 2
%109 = load i32, i32* %8
%110 = call i32 @check_three(i8* %108, i32 %109)
br label %111
111: ; preds = %64, %102, %93, %84, %75, %66
%112 = load i8*, i8** %11
%113 = icmp ne i8* %112, null
br i1 %113, label %114, label %117
114: ; preds = %111
%115 = load i8*, i8** %11
%116 = call i32 @free(i8* %115)
br label %117
117: ; preds = %114, %111
%118 = load i8**, i8*** %6
%119 = load i32, i32* %14
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds i8*, i8** %118, i64 %120
%122 = load i8*, i8** %121
%123 = getelementptr inbounds i8, i8* %122, i64 2
%124 = call i32 @strlen(i8* %123)
%125 = add nsw i32 %124, 1
%126 = call i64 @calloc(i32 %125, i64 1)
%127 = inttoptr i64 %126 to i8*
store i8* %127, i8** %11
%128 = call i32 @check_alloc(i8* %127)
%129 = load i8*, i8** %11
%130 = load i8**, i8*** %6
%131 = load i32, i32* %14
%132 = sext i32 %131 to i64
%133 = getelementptr inbounds i8*, i8** %130, i64 %132
%134 = load i8*, i8** %133
%135 = getelementptr inbounds i8, i8* %134, i64 2
%136 = call i32 @strcpy(i8* %129, i8* %135)
%137 = load i8**, i8*** %6
%138 = load i32, i32* %14
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds i8*, i8** %137, i64 %139
store i8* null, i8** %140
br label %259
141: ; preds = %56
%142 = load i8**, i8*** %6
%143 = load i32, i32* %14
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8*, i8** %142, i64 %144
store i8* null, i8** %145
%146 = load i32, i32* %14
%147 = add nsw i32 %146, 1
store i32 %147, i32* %14
%148 = load i32, i32* %14
%149 = load i32, i32* %7
%150 = icmp slt i32 %148, %149
br i1 %150, label %151, label %251
151: ; preds = %141
%152 = load i8**, i8*** %6
%153 = load i32, i32* %14
%154 = sext i32 %153 to i64
%155 = getelementptr inbounds i8*, i8** %152, i64 %154
%156 = load i8*, i8** %155
%157 = icmp ne i8* %156, null
br i1 %157, label %158, label %250
158: ; preds = %151
%159 = load i32, i32* %9
switch i32 %159, label %209 [
i32 117, label %160
i32 100, label %168
i32 102, label %176
i32 50, label %184
i32 51, label %192
i32 111, label %201
]
160: ; preds = %158
%161 = load i8**, i8*** %6
%162 = load i32, i32* %14
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds i8*, i8** %161, i64 %163
%165 = load i8*, i8** %164
%166 = load i32, i32* %8
%167 = call i32 @check_unsigned(i8* %165, i32 %166)
br label %209
168: ; preds = %158
%169 = load i8**, i8*** %6
%170 = load i32, i32* %14
%171 = sext i32 %170 to i64
%172 = getelementptr inbounds i8*, i8** %169, i64 %171
%173 = load i8*, i8** %172
%174 = load i32, i32* %8
%175 = call i32 @check_integer(i8* %173, i32 %174)
br label %209
176: ; preds = %158
%177 = load i8**, i8*** %6
%178 = load i32, i32* %14
%179 = sext i32 %178 to i64
%180 = getelementptr inbounds i8*, i8** %177, i64 %179
%181 = load i8*, i8** %180
%182 = load i32, i32* %8
%183 = call i32 @check_float(i8* %181, i32 %182)
br label %209
184: ; preds = %158
%185 = load i8**, i8*** %6
%186 = load i32, i32* %14
%187 = sext i32 %186 to i64
%188 = getelementptr inbounds i8*, i8** %185, i64 %187
%189 = load i8*, i8** %188
%190 = load i32, i32* %8
%191 = call i32 @check_two(i8* %189, i32 %190)
br label %209
192: ; preds = %158
%193 = load i8**, i8*** %6
%194 = load i32, i32* %14
%195 = sext i32 %194 to i64
%196 = getelementptr inbounds i8*, i8** %193, i64 %195
%197 = load i8*, i8** %196
%198 = getelementptr inbounds i8, i8* %197, i64 2
%199 = load i32, i32* %8
%200 = call i32 @check_three(i8* %198, i32 %199)
br label %209
201: ; preds = %158
%202 = load i8**, i8*** %6
%203 = load i32, i32* %14
%204 = sext i32 %203 to i64
%205 = getelementptr inbounds i8*, i8** %202, i64 %204
%206 = load i8*, i8** %205
%207 = load i32, i32* %8
%208 = call signext i8 @check_optional(i8* %206, i32 %207)
store i8 %208, i8* %13
br label %209
209: ; preds = %158, %201, %192, %184, %176, %168, %160
%210 = load i8, i8* %13
%211 = icmp ne i8 %210, 0
br i1 %211, label %212, label %240
212: ; preds = %209
%213 = load i8*, i8** %11
%214 = icmp ne i8* %213, null
br i1 %214, label %215, label %218
215: ; preds = %212
%216 = load i8*, i8** %11
%217 = call i32 @free(i8* %216)
br label %218
218: ; preds = %215, %212
%219 = load i8**, i8*** %6
%220 = load i32, i32* %14
%221 = sext i32 %220 to i64
%222 = getelementptr inbounds i8*, i8** %219, i64 %221
%223 = load i8*, i8** %222
%224 = call i32 @strlen(i8* %223)
%225 = add nsw i32 %224, 1
%226 = call i64 @calloc(i32 %225, i64 1)
%227 = inttoptr i64 %226 to i8*
store i8* %227, i8** %11
%228 = call i32 @check_alloc(i8* %227)
%229 = load i8*, i8** %11
%230 = load i8**, i8*** %6
%231 = load i32, i32* %14
%232 = sext i32 %231 to i64
%233 = getelementptr inbounds i8*, i8** %230, i64 %232
%234 = load i8*, i8** %233
%235 = call i32 @strcpy(i8* %229, i8* %234)
%236 = load i8**, i8*** %6
%237 = load i32, i32* %14
%238 = sext i32 %237 to i64
%239 = getelementptr inbounds i8*, i8** %236, i64 %238
store i8* null, i8** %239
br label %249
240: ; preds = %209
%241 = load i32, i32* %14
%242 = add nsw i32 %241, -1
store i32 %242, i32* %14
%243 = load i8*, i8** %11
%244 = icmp ne i8* %243, null
br i1 %244, label %245, label %248
245: ; preds = %240
%246 = load i8*, i8** %11
%247 = call i32 @free(i8* %246)
br label %248
248: ; preds = %245, %240
store i8* null, i8** %11
br label %249
249: ; preds = %248, %218
br label %250
250: ; preds = %249, %151
br label %258
251: ; preds = %141
%252 = load i8*, i8** %11
%253 = icmp ne i8* %252, null
br i1 %253, label %254, label %257
254: ; preds = %251
%255 = load i8*, i8** %11
%256 = call i32 @free(i8* %255)
store i8* null, i8** %11
br label %257
257: ; preds = %254, %251
br label %258
258: ; preds = %257, %250
br label %259
259: ; preds = %258, %117
br label %265
260: ; preds = %53
%261 = load i8**, i8*** %6
%262 = load i32, i32* %14
%263 = sext i32 %262 to i64
%264 = getelementptr inbounds i8*, i8** %261, i64 %263
store i8* null, i8** %264
br label %265
265: ; preds = %260, %259
br label %266
266: ; preds = %265, %47
br label %267
267: ; preds = %266, %19
br label %268
268: ; preds = %267
%269 = load i32, i32* %14
%270 = add nsw i32 %269, 1
store i32 %270, i32* %14
br label %15
271: ; preds = %15
%272 = load i32, i32* %9
%273 = icmp eq i32 %272, 111
br i1 %273, label %277, label %274
274: ; preds = %271
%275 = load i32, i32* %9
%276 = icmp eq i32 %275, 110
br i1 %276, label %277, label %285
277: ; preds = %274, %271
%278 = load i8*, i8** %11
%279 = icmp eq i8* %278, null
br i1 %279, label %280, label %285
280: ; preds = %277
%281 = load i8, i8* %12
%282 = sext i8 %281 to i32
%283 = icmp ne i32 %282, 0
br i1 %283, label %284, label %285
284: ; preds = %280
store i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0), i8** %5
br label %299
285: ; preds = %280, %277, %274
%286 = load i8, i8* %12
%287 = sext i8 %286 to i32
%288 = icmp ne i32 %287, 0
br i1 %288, label %289, label %297
289: ; preds = %285
%290 = load i8*, i8** %11
%291 = icmp eq i8* %290, null
br i1 %291, label %292, label %297
292: ; preds = %289
%293 = load i32, i32* @stderr
%294 = load i32, i32* %8
%295 = call i32 @fprintf(i32 %293, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.1, i64 0, i64 0), i32 %294)
%296 = call i32 @exit(i32 6)
unreachable
297: ; preds = %289, %285
%298 = load i8*, i8** %11
store i8* %298, i8** %5
br label %299
299: ; preds = %297, %284
%300 = load i8*, i8** %5
ret i8* %300
}

LLVM IR (-O2):
@.str = [1 x i8] zeroinitializer
@stderr = global i32 0
@.str.1 = [43 x i8] c"The option -%c needs some value. Exiting!\0A\00"
define i8* @check_option(i8** nocapture %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp sgt i32 %1, 1
br i1 %5, label %6, label %131
6: ; preds = %4
%7 = icmp eq i32 %3, 110
br label %8
8: ; preds = %6, %111
%9 = phi i32 [ 1, %6 ], [ %116, %111 ]
%10 = phi i8 [ 1, %6 ], [ %114, %111 ]
%11 = phi i8 [ 0, %6 ], [ %113, %111 ]
%12 = phi i8* [ null, %6 ], [ %112, %111 ]
%13 = sext i32 %9 to i64
%14 = getelementptr inbounds i8*, i8** %0, i64 %13
%15 = load i8*, i8** %14
%16 = icmp eq i8* %15, null
br i1 %16, label %111, label %17
17: ; preds = %8
%18 = load i8, i8* %15
%19 = icmp eq i8 %18, 45
br i1 %19, label %20, label %111
20: ; preds = %17
%21 = getelementptr inbounds i8, i8* %15, i64 1
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
%24 = icmp eq i32 %23, %2
br i1 %24, label %25, label %111
25: ; preds = %20
br i1 %7, label %110, label %26
26: ; preds = %25
%27 = tail call i32 @strlen(i8* %15)
%28 = icmp sgt i32 %27, 2
br i1 %28, label %29, label %65
29: ; preds = %26
switch i32 %3, label %50 [
i32 117, label %30
i32 100, label %34
i32 102, label %38
i32 50, label %42
i32 51, label %46
]
30: ; preds = %29
%31 = load i8*, i8** %14
%32 = getelementptr inbounds i8, i8* %31, i64 2
%33 = tail call i32 @check_unsigned(i8* %32, i32 %2)
br label %50
34: ; preds = %29
%35 = load i8*, i8** %14
%36 = getelementptr inbounds i8, i8* %35, i64 2
%37 = tail call i32 @check_integer(i8* %36, i32 %2)
br label %50
38: ; preds = %29
%39 = load i8*, i8** %14
%40 = getelementptr inbounds i8, i8* %39, i64 2
%41 = tail call i32 @check_float(i8* %40, i32 %2)
br label %50
42: ; preds = %29
%43 = load i8*, i8** %14
%44 = getelementptr inbounds i8, i8* %43, i64 2
%45 = tail call i32 @check_two(i8* %44, i32 %2)
br label %50
46: ; preds = %29
%47 = load i8*, i8** %14
%48 = getelementptr inbounds i8, i8* %47, i64 2
%49 = tail call i32 @check_three(i8* %48, i32 %2)
br label %50
50: ; preds = %29, %46, %42, %38, %34, %30
%51 = icmp eq i8* %12, null
br i1 %51, label %54, label %52
52: ; preds = %50
%53 = tail call i32 @free(i8* %12)
br label %54
54: ; preds = %52, %50
%55 = load i8*, i8** %14
%56 = getelementptr inbounds i8, i8* %55, i64 2
%57 = tail call i32 @strlen(i8* %56)
%58 = add nsw i32 %57, 1
%59 = tail call i64 @calloc(i32 %58, i64 1)
%60 = inttoptr i64 %59 to i8*
%61 = tail call i32 @check_alloc(i8* %60)
%62 = load i8*, i8** %14
%63 = getelementptr inbounds i8, i8* %62, i64 2
%64 = tail call i32 @strcpy(i8* %60, i8* %63)
store i8* null, i8** %14
br label %111
65: ; preds = %26
store i8* null, i8** %14
%66 = add nsw i32 %9, 1
%67 = icmp slt i32 %66, %1
br i1 %67, label %68, label %106
68: ; preds = %65
%69 = sext i32 %66 to i64
%70 = getelementptr inbounds i8*, i8** %0, i64 %69
%71 = load i8*, i8** %70
%72 = icmp eq i8* %71, null
br i1 %72, label %111, label %73
73: ; preds = %68
switch i32 %3, label %87 [
i32 117, label %74
i32 100, label %76
i32 102, label %78
i32 50, label %80
i32 51, label %82
i32 111, label %85
]
74: ; preds = %73
%75 = tail call i32 @check_unsigned(i8* %71, i32 %2)
br label %87
76: ; preds = %73
%77 = tail call i32 @check_integer(i8* %71, i32 %2)
br label %87
78: ; preds = %73
%79 = tail call i32 @check_float(i8* %71, i32 %2)
br label %87
80: ; preds = %73
%81 = tail call i32 @check_two(i8* %71, i32 %2)
br label %87
82: ; preds = %73
%83 = getelementptr inbounds i8, i8* %71, i64 2
%84 = tail call i32 @check_three(i8* %83, i32 %2)
br label %87
85: ; preds = %73
%86 = tail call signext i8 @check_optional(i8* %71, i32 %2)
br label %87
87: ; preds = %73, %85, %82, %80, %78, %76, %74
%88 = phi i8 [ %10, %73 ], [ %86, %85 ], [ %10, %82 ], [ %10, %80 ], [ %10, %78 ], [ %10, %76 ], [ %10, %74 ]
%89 = icmp eq i8 %88, 0
%90 = icmp eq i8* %12, null
br i1 %89, label %103, label %91
91: ; preds = %87
br i1 %90, label %94, label %92
92: ; preds = %91
%93 = tail call i32 @free(i8* %12)
br label %94
94: ; preds = %92, %91
%95 = load i8*, i8** %70
%96 = tail call i32 @strlen(i8* %95)
%97 = add nsw i32 %96, 1
%98 = tail call i64 @calloc(i32 %97, i64 1)
%99 = inttoptr i64 %98 to i8*
%100 = tail call i32 @check_alloc(i8* %99)
%101 = load i8*, i8** %70
%102 = tail call i32 @strcpy(i8* %99, i8* %101)
store i8* null, i8** %70
br label %111
103: ; preds = %87
br i1 %90, label %111, label %104
104: ; preds = %103
%105 = tail call i32 @free(i8* %12)
br label %111
106: ; preds = %65
%107 = icmp eq i8* %12, null
br i1 %107, label %111, label %108
108: ; preds = %106
%109 = tail call i32 @free(i8* %12)
br label %111
110: ; preds = %25
store i8* null, i8** %14
br label %111
111: ; preds = %17, %103, %104, %8, %110, %94, %68, %108, %106, %54, %20
%112 = phi i8* [ %60, %54 ], [ %99, %94 ], [ %12, %68 ], [ null, %108 ], [ null, %106 ], [ %12, %110 ], [ %12, %20 ], [ %12, %8 ], [ null, %104 ], [ null, %103 ], [ %12, %17 ]
%113 = phi i8 [ 1, %54 ], [ 1, %94 ], [ 1, %68 ], [ 1, %108 ], [ 1, %106 ], [ 1, %110 ], [ %11, %20 ], [ %11, %8 ], [ 1, %104 ], [ 1, %103 ], [ %11, %17 ]
%114 = phi i8 [ %10, %54 ], [ %88, %94 ], [ %10, %68 ], [ %10, %108 ], [ %10, %106 ], [ %10, %110 ], [ %10, %20 ], [ %10, %8 ], [ 0, %104 ], [ 0, %103 ], [ %10, %17 ]
%115 = phi i32 [ %9, %54 ], [ %66, %94 ], [ %66, %68 ], [ %66, %108 ], [ %66, %106 ], [ %9, %110 ], [ %9, %20 ], [ %9, %8 ], [ %9, %104 ], [ %9, %103 ], [ %9, %17 ]
%116 = add nsw i32 %115, 1
%117 = icmp slt i32 %116, %1
br i1 %117, label %8, label %118
118: ; preds = %111
%119 = and i32 %3, -2
%120 = icmp eq i32 %119, 110
%121 = icmp eq i8* %112, null
%122 = select i1 %120, i1 %121, i1 false
%123 = icmp ne i8 %113, 0
%124 = select i1 %122, i1 %123, i1 false
br i1 %124, label %131, label %125
125: ; preds = %118
%126 = select i1 %123, i1 %121, i1 false
br i1 %126, label %127, label %131
127: ; preds = %125
%128 = load i32, i32* @stderr
%129 = tail call i32 @fprintf(i32 %128, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.1, i64 0, i64 0), i32 %2)
%130 = tail call i32 @exit(i32 6)
unreachable
131: ; preds = %4, %125, %118
%132 = phi i8* [ getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0), %118 ], [ %112, %125 ], [ null, %4 ]
ret i8* %132
}