#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 */
typedef int /*<<< orphan*/ buf;
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int EOF;
int /*<<< orphan*/ fatal(char *, char *);
int /*<<< orphan*/ fclose(int /*<<< orphan*/ *);
int fgetc(int /*<<< orphan*/ *);
int /*<<< orphan*/ *fopen(char *, char *);
scalar_t__ isspace(char);
char *sipStrdup(char *);
char *strchr(char *, char);
int /*<<< orphan*/ usage();
char parseopt(int argc, char **argv, char *opts, char **flags, int *optnrp,
              char **optargp) {
  char arg, *op, *fname;
  int optnr;
  static FILE *fp = NULL;
  fname = *flags;
  if (fname != NULL && fp == NULL && (fp = fopen(fname, "r")) == NULL)
    fatal("Unable to open %s\n", fname);
  if (fp != NULL) {
    char buf[200], *cp, *fname;
    int ch;
    fname = *flags;
    cp = buf;
    while ((ch = fgetc(fp)) != EOF) {
      if (cp == buf && isspace(ch))
        continue;
      if (ch == '\n')
        break;
      if (cp == &buf[sizeof(buf) - 1])
        fatal("A flag in %s is too long\n", fname);
      *cp++ = (char)ch;
    }
    *cp = '\0';
    if (ch == EOF) {
      fclose(fp);
      fp = NULL;
      *flags = NULL;
    }
    if (buf[0] != '\0') {
      if (buf[0] != '-' || buf[1] == '\0')
        fatal("An non-flag was given in %s\n", fname);
      arg = buf[1];
      for (cp = &buf[2]; *cp != '\0'; ++cp)
        if (!isspace(*cp))
          break;
      if (*cp == '\0')
        cp = NULL;
      else
        cp = sipStrdup(cp);
      *optargp = cp;
      if ((op = strchr(opts, arg)) == NULL)
        fatal("An invalid flag was given in %s\n", fname);
      if (op[1] == ':' && cp == NULL)
        fatal("Missing flag argument in %s\n", fname);
      if (op[1] != ':' && cp != NULL)
        fatal("Unexpected flag argument in %s\n", fname);
      return arg;
    }
  }
  optnr = *optnrp;
  if (optnr >= argc || argv[optnr] == NULL || argv[optnr][0] != '-')
    return '\0';
  arg = argv[optnr][1];
  if (arg == '\0' || (op = strchr(opts, arg)) == NULL)
    usage();
  if (op[1] == ':') {
    if (argv[optnr][2] != '\0') {
      *optargp = &argv[optnr][2];
      ++optnr;
    } else if (optnr + 1 >= argc || argv[optnr + 1] == NULL)
      usage();
    else {
      *optargp = argv[optnr + 1];
      optnr += 2;
    }
  } else if (argv[optnr][2] != '\0')
    usage();
  else {
    *optargp = NULL;
    ++optnr;
  }
  *optnrp = optnr;
  return arg;
}


x86 assembly (clang, -O0):
<parseopt>:
push   %rbp
mov    %rsp,%rbp
sub    $0x140,%rsp
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x48(%rbp)
cmpq   $0x0,-0x48(%rbp)
je     11f7 <parseopt+0x77>
cmpq   $0x0,0x2ea8(%rip)
jne    11f7 <parseopt+0x77>
mov    -0x48(%rbp),%rdi
lea    0xe2f(%rip),%rsi
call   1090 <fopen@plt>
mov    %rax,0x2e8b(%rip)
cmp    $0x0,%rax
jne    11f7 <parseopt+0x77>
mov    -0x48(%rbp),%rsi
lea    0xe10(%rip),%rdi
call   10a0 <fatal@plt>
cmpq   $0x0,0x2e69(%rip)
je     14af <parseopt+0x32f>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x130(%rbp)
lea    -0x120(%rbp),%rax
mov    %rax,-0x128(%rbp)
mov    0x2e40(%rip),%rdi
call   1060 <fgetc@plt>
mov    %eax,-0x134(%rbp)
mov    0x2dae(%rip),%rcx
cmp    (%rcx),%eax
je     12dd <parseopt+0x15d>
mov    -0x128(%rbp),%rax
lea    -0x120(%rbp),%rcx
cmp    %rcx,%rax
jne    1276 <parseopt+0xf6>
mov    -0x134(%rbp),%eax
movsbl %al,%edi
call   1070 <isspace@plt>
cmp    $0x0,%rax
je     1276 <parseopt+0xf6>
jmp    1221 <parseopt+0xa1>
cmpl   $0xa,-0x134(%rbp)
jne    1288 <parseopt+0x108>
jmp    12dd <parseopt+0x15d>
mov    -0x128(%rbp),%rax
lea    -0x120(%rbp),%rcx
add    $0xc7,%rcx
cmp    %rcx,%rax
jne    12b9 <parseopt+0x139>
mov    -0x130(%rbp),%rsi
lea    0xd61(%rip),%rdi
call   10a0 <fatal@plt>
mov    -0x134(%rbp),%eax
mov    %al,%cl
mov    -0x128(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x128(%rbp)
mov    %cl,(%rax)
jmp    1221 <parseopt+0xa1>
mov    -0x128(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x134(%rbp),%eax
mov    0x2cf4(%rip),%rcx
cmp    (%rcx),%eax
jne    131e <parseopt+0x19e>
mov    0x2d65(%rip),%rdi
call   1030 <fclose@plt>
movq   $0x0,0x2d55(%rip)
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
movsbl -0x120(%rbp),%eax
cmp    $0x0,%eax
je     14aa <parseopt+0x32a>
movsbl -0x120(%rbp),%eax
cmp    $0x2d,%eax
jne    134e <parseopt+0x1ce>
movsbl -0x11f(%rbp),%eax
cmp    $0x0,%eax
jne    1361 <parseopt+0x1e1>
mov    -0x130(%rbp),%rsi
lea    0xcd3(%rip),%rdi
call   10a0 <fatal@plt>
mov    -0x11f(%rbp),%al
mov    %al,-0x31(%rbp)
lea    -0x120(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x128(%rbp)
mov    -0x128(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     13c9 <parseopt+0x249>
mov    -0x128(%rbp),%rax
movsbl (%rax),%edi
call   1070 <isspace@plt>
cmp    $0x0,%rax
jne    13ad <parseopt+0x22d>
jmp    13c9 <parseopt+0x249>
jmp    13b2 <parseopt+0x232>
mov    -0x128(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x128(%rbp)
jmp    137c <parseopt+0x1fc>
mov    -0x128(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    13ec <parseopt+0x26c>
movq   $0x0,-0x128(%rbp)
jmp    13ff <parseopt+0x27f>
mov    -0x128(%rbp),%rdi
call   1040 <sipStrdup@plt>
mov    %rax,-0x128(%rbp)
mov    -0x128(%rbp),%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rdi
movsbl -0x31(%rbp),%esi
call   1050 <strchr@plt>
mov    %rax,-0x40(%rbp)
cmp    $0x0,%rax
jne    143b <parseopt+0x2bb>
mov    -0x130(%rbp),%rsi
lea    0xc16(%rip),%rdi
call   10a0 <fatal@plt>
mov    -0x40(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x3a,%eax
jne    146d <parseopt+0x2ed>
cmpq   $0x0,-0x128(%rbp)
jne    146d <parseopt+0x2ed>
mov    -0x130(%rbp),%rsi
lea    0xc05(%rip),%rdi
call   10a0 <fatal@plt>
mov    -0x40(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x3a,%eax
je     149f <parseopt+0x31f>
cmpq   $0x0,-0x128(%rbp)
je     149f <parseopt+0x31f>
mov    -0x130(%rbp),%rsi
lea    0xbf0(%rip),%rdi
call   10a0 <fatal@plt>
mov    -0x31(%rbp),%al
mov    %al,-0x1(%rbp)
jmp    1633 <parseopt+0x4b3>
jmp    14af <parseopt+0x32f>
mov    -0x28(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    14ef <parseopt+0x36f>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
je     14ef <parseopt+0x36f>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
je     14f8 <parseopt+0x378>
movb   $0x0,-0x1(%rbp)
jmp    1633 <parseopt+0x4b3>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    0x1(%rax),%al
mov    %al,-0x31(%rbp)
movsbl -0x31(%rbp),%eax
cmp    $0x0,%eax
je     1532 <parseopt+0x3b2>
mov    -0x18(%rbp),%rdi
movsbl -0x31(%rbp),%esi
call   1050 <strchr@plt>
mov    %rax,-0x40(%rbp)
cmp    $0x0,%rax
jne    1539 <parseopt+0x3b9>
mov    $0x0,%al
call   1080 <usage@plt>
mov    -0x40(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x3a,%eax
jne    15e6 <parseopt+0x466>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
je     1588 <parseopt+0x408>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rcx
add    $0x2,%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    15e1 <parseopt+0x461>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
cmp    -0x8(%rbp),%eax
jge    15af <parseopt+0x42f>
mov    -0x10(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpq   $0x0,(%rax,%rcx,8)
jne    15bb <parseopt+0x43b>
mov    $0x0,%al
call   1080 <usage@plt>
jmp    15dc <parseopt+0x45c>
mov    -0x10(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x4c(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x4c(%rbp)
jmp    15e1 <parseopt+0x461>
jmp    1624 <parseopt+0x4a4>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
je     160b <parseopt+0x48b>
mov    $0x0,%al
call   1080 <usage@plt>
jmp    161f <parseopt+0x49f>
mov    -0x30(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1624 <parseopt+0x4a4>
mov    -0x4c(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x31(%rbp),%al
mov    %al,-0x1(%rbp)
movsbl -0x1(%rbp),%eax
add    $0x140,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<parseopt>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0xf8,%rsp
mov    %r9,%r14
mov    %r8,%r13
mov    %rcx,%rbp
mov    %rdx,%r15
mov    %rsi,0x18(%rsp)
mov    %edi,0xc(%rsp)
mov    (%rcx),%rbx
mov    0x2eb8(%rip),%rax
test   %rbx,%rbx
je     11eb <parseopt+0x6b>
test   %rax,%rax
jne    11eb <parseopt+0x6b>
lea    0xe3f(%rip),%rsi
mov    %rbx,%rdi
call   1090 <fopen@plt>
mov    %rax,0x2e98(%rip)
test   %rax,%rax
jne    11f4 <parseopt+0x74>
lea    0xe26(%rip),%rdi
mov    %rbx,%rsi
call   10a0 <fatal@plt>
mov    0x2e7d(%rip),%rax
test   %rax,%rax
je     1327 <parseopt+0x1a7>
mov    %r13,0x28(%rsp)
mov    %r15,0x20(%rsp)
mov    %r14,%r15
lea    0x30(%rsp),%rbx
mov    0x0(%rbp),%rax
mov    %rax,0x10(%rsp)
mov    0x2dd2(%rip),%r14
mov    %rbx,%r13
jmp    1230 <parseopt+0xb0>
mov    %r12b,0x0(%r13)
add    $0x1,%r13
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    0x2e31(%rip),%rdi
call   1060 <fgetc@plt>
cmp    (%r14),%eax
je     1281 <parseopt+0x101>
mov    %eax,%r12d
cmp    %rbx,%r13
jne    1257 <parseopt+0xd7>
movsbl %r12b,%edi
call   1070 <isspace@plt>
test   %rax,%rax
jne    1230 <parseopt+0xb0>
cmp    $0xa,%r12d
je     1429 <parseopt+0x2a9>
lea    0xf7(%rsp),%rax
cmp    %rax,%r13
jne    121b <parseopt+0x9b>
lea    0xda0(%rip),%rdi
mov    0x10(%rsp),%rsi
call   10a0 <fatal@plt>
jmp    121b <parseopt+0x9b>
movb   $0x0,0x0(%r13)
mov    0x2ddb(%rip),%rdi
call   1030 <fclose@plt>
movq   $0x0,0x2dcb(%rip)
movq   $0x0,0x0(%rbp)
mov    0x30(%rsp),%al
test   %al,%al
mov    %r15,%r14
mov    0x28(%rsp),%r13
je     1322 <parseopt+0x1a2>
cmp    $0x2d,%al
mov    0x20(%rsp),%r15
jne    12c8 <parseopt+0x148>
mov    0x31(%rsp),%r12b
test   %r12b,%r12b
jne    12de <parseopt+0x15e>
lea    0xd60(%rip),%rdi
mov    0x10(%rsp),%rsi
call   10a0 <fatal@plt>
mov    0x31(%rsp),%r12b
mov    0x32(%rsp),%al
test   %al,%al
je     13ab <parseopt+0x22b>
lea    0x32(%rsp),%rbp
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsbl %al,%edi
call   1070 <isspace@plt>
test   %rax,%rax
je     1398 <parseopt+0x218>
movzbl 0x1(%rbp),%eax
add    $0x1,%rbp
test   %al,%al
jne    1300 <parseopt+0x180>
jmp    13ad <parseopt+0x22d>
mov    0x20(%rsp),%r15
mov    0x0(%r13),%ebx
cmp    0xc(%rsp),%ebx
jge    1393 <parseopt+0x213>
movslq %ebx,%rbp
mov    0x18(%rsp),%rax
mov    (%rax,%rbp,8),%rax
test   %rax,%rax
je     1393 <parseopt+0x213>
cmpb   $0x2d,(%rax)
jne    1393 <parseopt+0x213>
mov    0x1(%rax),%r12b
test   %r12b,%r12b
je     146c <parseopt+0x2ec>
movsbl %r12b,%esi
mov    %r15,%rdi
call   1050 <strchr@plt>
test   %rax,%rax
je     146c <parseopt+0x2ec>
mov    0x18(%rsp),%rcx
mov    (%rcx,%rbp,8),%rcx
cmpb   $0x3a,0x1(%rax)
mov    0x2(%rcx),%al
jne    1419 <parseopt+0x299>
test   %al,%al
je     143f <parseopt+0x2bf>
add    $0x2,%rcx
mov    %rcx,(%r14)
jmp    1424 <parseopt+0x2a4>
xor    %r12d,%r12d
jmp    1404 <parseopt+0x284>
cmpb   $0x0,0x0(%rbp)
je     13ab <parseopt+0x22b>
mov    %rbp,%rdi
call   1040 <sipStrdup@plt>
mov    %rax,%rbx
jmp    13ad <parseopt+0x22d>
xor    %ebx,%ebx
mov    %rbx,(%r14)
movsbl %r12b,%esi
mov    %r15,%rdi
call   1050 <strchr@plt>
mov    %rax,%rbp
test   %rax,%rax
jne    13d5 <parseopt+0x255>
lea    0xc81(%rip),%rdi
mov    0x10(%rsp),%rsi
call   10a0 <fatal@plt>
mov    0x1(%rbp),%al
cmp    $0x3a,%al
jne    13ea <parseopt+0x26a>
test   %rbx,%rbx
jne    13ea <parseopt+0x26a>
lea    0xc85(%rip),%rdi
jmp    13fa <parseopt+0x27a>
cmp    $0x3a,%al
je     1404 <parseopt+0x284>
test   %rbx,%rbx
je     1404 <parseopt+0x284>
lea    0xc90(%rip),%rdi
mov    0x10(%rsp),%rsi
call   10a0 <fatal@plt>
mov    %r12d,%eax
add    $0xf8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
test   %al,%al
jne    145f <parseopt+0x2df>
movq   $0x0,(%r14)
add    $0x1,%ebx
jmp    1466 <parseopt+0x2e6>
mov    (%r14),%eax
movb   $0x0,0x0(%r13)
cmp    $0xa,%eax
je     1286 <parseopt+0x106>
jmp    12a5 <parseopt+0x125>
lea    0x1(%rbp),%eax
cmp    0xc(%rsp),%eax
jge    145f <parseopt+0x2df>
mov    0x18(%rsp),%rax
mov    0x8(%rax,%rbp,8),%rax
test   %rax,%rax
je     145f <parseopt+0x2df>
mov    %rax,(%r14)
add    $0x2,%ebx
jmp    1466 <parseopt+0x2e6>
xor    %eax,%eax
call   1080 <usage@plt>
mov    %ebx,0x0(%r13)
jmp    1404 <parseopt+0x284>
xor    %eax,%eax
call   1080 <usage@plt>

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

LLVM IR (-O2):
@parseopt.fp = internal unnamed_addr global i32* null
@.str = [2 x i8] c"r\00"
@.str.1 = [19 x i8] c"Unable to open %s\0A\00"
@EOF = global i32 0
@.str.2 = [26 x i8] c"A flag in %s is too long\0A\00"
@.str.3 = [29 x i8] c"An non-flag was given in %s\0A\00"
@.str.4 = [33 x i8] c"An invalid flag was given in %s\0A\00"
@.str.5 = [29 x i8] c"Missing flag argument in %s\0A\00"
@.str.6 = [32 x i8] c"Unexpected flag argument in %s\0A\00"
define signext i8 @parseopt(i32 %0, i8** nocapture %1, i8* %2, i8** nocapture %3, i32* nocapture %4, i8** nocapture writeonly %5) {
%7 = alloca [200 x i8]
%8 = load i8*, i8** %3
%9 = icmp ne i8* %8, null
%10 = load i32*, i32** @parseopt.fp
%11 = icmp eq i32* %10, null
%12 = select i1 %9, i1 %11, i1 false
br i1 %12, label %13, label %19
13: ; preds = %6
%14 = tail call i32* @fopen(i8* %8, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
store i32* %14, i32** @parseopt.fp
%15 = icmp eq i32* %14, null
br i1 %15, label %16, label %22
16: ; preds = %13
%17 = tail call i32 @fatal(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.1, i64 0, i64 0), i8* %8)
%18 = load i32*, i32** @parseopt.fp
br label %19
19: ; preds = %16, %6
%20 = phi i32* [ %18, %16 ], [ %10, %6 ]
%21 = icmp eq i32* %20, null
br i1 %21, label %107, label %22
22: ; preds = %13, %19
%23 = getelementptr inbounds [200 x i8], [200 x i8]* %7, i64 0, i64 0
%24 = load i8*, i8** %3
%25 = getelementptr inbounds [200 x i8], [200 x i8]* %7, i64 0, i64 199
br label %26
26: ; preds = %46, %22
%27 = phi i8* [ %48, %46 ], [ %23, %22 ]
%28 = icmp eq i8* %27, %23
br label %29
29: ; preds = %26, %36
%30 = load i32*, i32** @parseopt.fp
%31 = call i32 @fgetc(i32* %30)
%32 = load i32, i32* @EOF
%33 = icmp eq i32 %31, %32
br i1 %33, label %34, label %35
34: ; preds = %29
store i8 0, i8* %27
br label %52
35: ; preds = %29
br i1 %28, label %36, label %40
36: ; preds = %35
%37 = trunc i32 %31 to i8
%38 = call i64 @isspace(i8 signext %37)
%39 = icmp eq i64 %38, 0
br i1 %39, label %40, label %29
40: ; preds = %36, %35
%41 = icmp eq i32 %31, 10
br i1 %41, label %49, label %42
42: ; preds = %40
%43 = icmp eq i8* %27, %25
br i1 %43, label %44, label %46
44: ; preds = %42
%45 = call i32 @fatal(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str.2, i64 0, i64 0), i8* %24)
br label %46
46: ; preds = %44, %42
%47 = trunc i32 %31 to i8
%48 = getelementptr inbounds i8, i8* %27, i64 1
store i8 %47, i8* %27
br label %26
49: ; preds = %40
%50 = load i32, i32* @EOF
store i8 0, i8* %27
%51 = icmp eq i32 %50, 10
br i1 %51, label %52, label %55
52: ; preds = %34, %49
%53 = load i32*, i32** @parseopt.fp
%54 = call i32 @fclose(i32* %53)
store i32* null, i32** @parseopt.fp
store i8* null, i8** %3
br label %55
55: ; preds = %52, %49
%56 = load i8, i8* %23
%57 = icmp eq i8 %56, 0
br i1 %57, label %58, label %59
58: ; preds = %55
br label %107
59: ; preds = %55
%60 = icmp ne i8 %56, 45
%61 = getelementptr inbounds [200 x i8], [200 x i8]* %7, i64 0, i64 1
%62 = load i8, i8* %61
%63 = icmp eq i8 %62, 0
%64 = select i1 %60, i1 true, i1 %63
br i1 %64, label %65, label %68
65: ; preds = %59
%66 = call i32 @fatal(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.3, i64 0, i64 0), i8* %24)
%67 = load i8, i8* %61
br label %68
68: ; preds = %59, %65
%69 = phi i8 [ %62, %59 ], [ %67, %65 ]
%70 = getelementptr inbounds [200 x i8], [200 x i8]* %7, i64 0, i64 2
%71 = load i8, i8* %70
%72 = icmp eq i8 %71, 0
br i1 %72, label %87, label %73
73: ; preds = %68, %78
%74 = phi i8 [ %80, %78 ], [ %71, %68 ]
%75 = phi i8* [ %79, %78 ], [ %70, %68 ]
%76 = call i64 @isspace(i8 signext %74)
%77 = icmp eq i64 %76, 0
br i1 %77, label %82, label %78
78: ; preds = %73
%79 = getelementptr inbounds i8, i8* %75, i64 1
%80 = load i8, i8* %79
%81 = icmp eq i8 %80, 0
br i1 %81, label %87, label %73
82: ; preds = %73
%83 = load i8, i8* %75
%84 = icmp eq i8 %83, 0
br i1 %84, label %87, label %85
85: ; preds = %82
%86 = call i8* @sipStrdup(i8* %75)
br label %87
87: ; preds = %78, %68, %82, %85
%88 = phi i8* [ %86, %85 ], [ null, %82 ], [ null, %68 ], [ null, %78 ]
store i8* %88, i8** %5
%89 = call i8* @strchr(i8* dereferenceable(1) %2, i8 signext %69)
%90 = icmp eq i8* %89, null
br i1 %90, label %91, label %93
91: ; preds = %87
%92 = call i32 @fatal(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.4, i64 0, i64 0), i8* %24)
br label %93
93: ; preds = %91, %87
%94 = getelementptr inbounds i8, i8* %89, i64 1
%95 = load i8, i8* %94
%96 = icmp eq i8 %95, 58
%97 = icmp eq i8* %88, null
%98 = select i1 %96, i1 %97, i1 false
br i1 %98, label %103, label %99
99: ; preds = %93
%100 = icmp ne i8 %95, 58
%101 = icmp ne i8* %88, null
%102 = select i1 %100, i1 %101, i1 false
br i1 %102, label %103, label %106
103: ; preds = %99, %93
%104 = phi i8* [ getelementptr inbounds ([29 x i8], [29 x i8]* @.str.5, i64 0, i64 0), %93 ], [ getelementptr inbounds ([32 x i8], [32 x i8]* @.str.6, i64 0, i64 0), %99 ]
%105 = call i32 @fatal(i8* %104, i8* %24)
br label %106
106: ; preds = %103, %99
br label %157
107: ; preds = %58, %19
%108 = load i32, i32* %4
%109 = icmp slt i32 %108, %0
br i1 %109, label %110, label %157
110: ; preds = %107
%111 = sext i32 %108 to i64
%112 = getelementptr inbounds i8*, i8** %1, i64 %111
%113 = load i8*, i8** %112
%114 = icmp eq i8* %113, null
br i1 %114, label %157, label %115
115: ; preds = %110
%116 = load i8, i8* %113
%117 = icmp eq i8 %116, 45
br i1 %117, label %118, label %157
118: ; preds = %115
%119 = getelementptr inbounds i8, i8* %113, i64 1
%120 = load i8, i8* %119
%121 = icmp eq i8 %120, 0
br i1 %121, label %125, label %122
122: ; preds = %118
%123 = call i8* @strchr(i8* dereferenceable(1) %2, i8 signext %120)
%124 = icmp eq i8* %123, null
br i1 %124, label %125, label %127
125: ; preds = %122, %118
%126 = call i32 (...) @usage()
unreachable
127: ; preds = %122
%128 = getelementptr inbounds i8, i8* %123, i64 1
%129 = load i8, i8* %128
%130 = icmp eq i8 %129, 58
%131 = load i8*, i8** %112
%132 = getelementptr inbounds i8, i8* %131, i64 2
%133 = load i8, i8* %132
%134 = icmp eq i8 %133, 0
br i1 %130, label %135, label %150
135: ; preds = %127
br i1 %134, label %138, label %136
136: ; preds = %135
store i8* %132, i8** %5
%137 = add nsw i32 %108, 1
br label %155
138: ; preds = %135
%139 = add nsw i32 %108, 1
%140 = icmp slt i32 %139, %0
br i1 %140, label %141, label %146
141: ; preds = %138
%142 = sext i32 %139 to i64
%143 = getelementptr inbounds i8*, i8** %1, i64 %142
%144 = load i8*, i8** %143
%145 = icmp eq i8* %144, null
br i1 %145, label %146, label %148
146: ; preds = %141, %138
%147 = call i32 (...) @usage()
br label %155
148: ; preds = %141
store i8* %144, i8** %5
%149 = add nsw i32 %108, 2
br label %155
150: ; preds = %127
br i1 %134, label %153, label %151
151: ; preds = %150
%152 = call i32 (...) @usage()
br label %155
153: ; preds = %150
store i8* null, i8** %5
%154 = add nsw i32 %108, 1
br label %155
155: ; preds = %151, %153, %136, %148, %146
%156 = phi i32 [ %137, %136 ], [ %108, %146 ], [ %149, %148 ], [ %108, %151 ], [ %154, %153 ]
store i32 %156, i32* %4
br label %157
157: ; preds = %106, %107, %110, %115, %155
%158 = phi i8 [ %120, %155 ], [ %69, %106 ], [ 0, %115 ], [ 0, %110 ], [ 0, %107 ]
ret i8 %158
}