#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 stat {
  long st_size;
};

/* Variables and functions */
int EOF;
int /*<<< orphan*/ SEEK_END;
int atoi(char *);
int /*<<< orphan*/ exit(int);
int /*<<< orphan*/ fileno(scalar_t__);
int /*<<< orphan*/ fputs(char *, int /*<<< orphan*/);
scalar_t__ freopen(char *, char *, scalar_t__);
int /*<<< orphan*/ fseek(scalar_t__, long, int /*<<< orphan*/);
scalar_t__ fstat(int /*<<< orphan*/, struct stat *);
int getopt(int, char **, char *);
scalar_t__ isdigit(char);
char *optarg;
scalar_t__ optind;
int /*<<< orphan*/ stderr;
scalar_t__ stdin;
scalar_t__ strtol(char *, char **, int);
int tail(int, int, int);
int /*<<< orphan*/ usage();
int main(int argc, char *argv[]) {
  int cflag = 0;
  int nflag = 0;
  int fflag = 0;
  int number = -10;
  char *suffix;
  int opt;
  struct stat stat_buf;
  if (argc == 1) {
    exit(tail(-10, 0, fflag));
  }
  if ((argv[1][0] == '+') ||
      (argv[1][0] == '-' && ((isdigit(argv[1][1])) || (argv[1][1] == 'l') ||
                             (argv[1][1] == 'c' && argv[1][2] == 'f')))) {
    --argc;
    ++argv;
    if (isdigit(argv[0][1])) {
      number = (int)strtol(argv[0], &suffix, 10);
      if (number == 0) {
        if (argv[0][0] == '+')
          number = 1;
        else
          exit(0);
      }
    } else {
      number = (argv[0][0] == '+') ? 10 : -10;
      suffix = &(argv[0][1]);
    }
    if (*suffix != '\0') {
      if (*suffix == 'c') {
        cflag = 1;
        ++suffix;
      } else if (*suffix == 'l') {
        nflag = 1;
        ++suffix;
      }
    }
    if (*suffix != '\0') {
      if (*suffix == 'f') {
        fflag = 1;
        ++suffix;
      }
    }
    if (*suffix != '\0') {
      number = -10;
      cflag = nflag = 0;
      fflag = 0;
    } else {
      --argc;
      ++argv;
    }
  } else {
    while ((opt = getopt(argc, argv, "c:fn:")) != EOF) {
      switch (opt) {
      case 'c':
        cflag = 1;
        if (*optarg == '+' || *optarg == '-')
          number = atoi(optarg);
        else if (isdigit(*optarg))
          number = -atoi(optarg);
        else
          usage();
        if (number == 0) {
          if (*optarg == '+')
            number = 1;
          else
            exit(0);
        }
        break;
      case 'f':
        fflag = 1;
        break;
      case 'n':
        nflag = 1;
        if (*optarg == '+' || *optarg == '-')
          number = atoi(optarg);
        else if (isdigit(*optarg))
          number = -atoi(optarg);
        else
          usage();
        if (number == 0) {
          if (*optarg == '+')
            number = 1;
          else
            exit(0);
        }
        break;
      default:
        usage();
      }
    }
    argc -= optind;
    argv += optind;
  }
  if (argc > 1 || (cflag && nflag)) {
    usage();
  }
  if (argc > 0) {
    if (freopen(argv[0], "r", stdin) != stdin) {
      fputs("tail: could not open ", stderr);
      fputs(argv[0], stderr);
      fputs("\n", stderr);
      exit(1);
    }
    if (number < 0 && fstat(fileno(stdin), &stat_buf) == 0) {
      long offset = cflag ? (long)number : (long)number * 2048;
      if (-offset < stat_buf.st_size)
        fseek(stdin, offset, SEEK_END);
    }
  } else {
    fflag = 0;
  }
  exit(tail(number, cflag, fflag));
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movl   $0x0,-0x4(%rbp)
mov    %edi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0xfffffff6,-0x20(%rbp)
cmpl   $0x1,-0x8(%rbp)
jne    1212 <main+0x52>
mov    -0x1c(%rbp),%edx
mov    $0xfffffff6,%edi
xor    %esi,%esi
call   1080 <tail@plt>
mov    %eax,%edi
call   10d0 <exit@plt>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
je     1294 <main+0xd4>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1429 <main+0x269>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsbl 0x1(%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
jne    1294 <main+0xd4>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsbl 0x1(%rax),%eax
cmp    $0x6c,%eax
je     1294 <main+0xd4>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsbl 0x1(%rax),%eax
cmp    $0x63,%eax
jne    1429 <main+0x269>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
movsbl 0x2(%rax),%eax
cmp    $0x66,%eax
jne    1429 <main+0x269>
mov    -0x8(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsbl 0x1(%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     1315 <main+0x155>
mov    -0x10(%rbp),%rax
mov    (%rax),%rdi
lea    -0x28(%rbp),%rsi
mov    $0xa,%edx
call   1060 <strtol@plt>
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jne    1310 <main+0x150>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1304 <main+0x144>
movl   $0x1,-0x20(%rbp)
jmp    130b <main+0x14b>
xor    %edi,%edi
call   10d0 <exit@plt>
jmp    1310 <main+0x150>
jmp    1341 <main+0x181>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%edx
mov    $0xfffffff6,%eax
mov    $0xa,%ecx
cmp    $0x2b,%edx
cmove  %ecx,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     13a6 <main+0x1e6>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x63,%eax
jne    1379 <main+0x1b9>
movl   $0x1,-0x14(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13a1 <main+0x1e1>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x6c,%eax
jne    139c <main+0x1dc>
movl   $0x1,-0x18(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13a1 <main+0x1e1>
jmp    13a6 <main+0x1e6>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     13de <main+0x21e>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x66,%eax
jne    13d9 <main+0x219>
movl   $0x1,-0x1c(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13de <main+0x21e>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     140f <main+0x24f>
movl   $0xfffffff6,-0x20(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x1c(%rbp)
jmp    1424 <main+0x264>
mov    -0x8(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
jmp    1663 <main+0x4a3>
jmp    142e <main+0x26e>
mov    -0x8(%rbp),%edi
mov    -0x10(%rbp),%rsi
lea    0xbc4(%rip),%rdx
call   10b0 <getopt@plt>
mov    %eax,-0x2c(%rbp)
mov    0x2b85(%rip),%rcx
cmp    (%rcx),%eax
je     1639 <main+0x479>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x44(%rbp)
sub    $0x63,%eax
je     1489 <main+0x2c9>
jmp    1467 <main+0x2a7>
mov    -0x44(%rbp),%eax
sub    $0x66,%eax
je     1555 <main+0x395>
jmp    1478 <main+0x2b8>
mov    -0x44(%rbp),%eax
sub    $0x6e,%eax
je     1561 <main+0x3a1>
jmp    162d <main+0x46d>
movl   $0x1,-0x14(%rbp)
mov    0x2b61(%rip),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
je     14bc <main+0x2fc>
mov    0x2b4b(%rip),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    14d3 <main+0x313>
mov    0x2b35(%rip),%rax
mov    (%rax),%rdi
call   10c0 <atoi@plt>
mov    %eax,-0x20(%rbp)
jmp    1518 <main+0x358>
mov    0x2b1e(%rip),%rax
mov    (%rax),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     150c <main+0x34c>
mov    0x2b02(%rip),%rax
mov    (%rax),%rdi
call   10c0 <atoi@plt>
mov    %eax,%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
jmp    1513 <main+0x353>
mov    $0x0,%al
call   10a0 <usage@plt>
jmp    1518 <main+0x358>
cmpl   $0x0,-0x20(%rbp)
jne    1550 <main+0x390>
mov    0x2acf(%rip),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1544 <main+0x384>
movl   $0x1,-0x20(%rbp)
jmp    154b <main+0x38b>
xor    %edi,%edi
call   10d0 <exit@plt>
jmp    1550 <main+0x390>
jmp    1634 <main+0x474>
movl   $0x1,-0x1c(%rbp)
jmp    1634 <main+0x474>
movl   $0x1,-0x18(%rbp)
mov    0x2a89(%rip),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
je     1594 <main+0x3d4>
mov    0x2a73(%rip),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    15ab <main+0x3eb>
mov    0x2a5d(%rip),%rax
mov    (%rax),%rdi
call   10c0 <atoi@plt>
mov    %eax,-0x20(%rbp)
jmp    15f0 <main+0x430>
mov    0x2a46(%rip),%rax
mov    (%rax),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     15e4 <main+0x424>
mov    0x2a2a(%rip),%rax
mov    (%rax),%rdi
call   10c0 <atoi@plt>
mov    %eax,%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x20(%rbp)
jmp    15eb <main+0x42b>
mov    $0x0,%al
call   10a0 <usage@plt>
jmp    15f0 <main+0x430>
cmpl   $0x0,-0x20(%rbp)
jne    1628 <main+0x468>
mov    0x29f7(%rip),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    161c <main+0x45c>
movl   $0x1,-0x20(%rbp)
jmp    1623 <main+0x463>
xor    %edi,%edi
call   10d0 <exit@plt>
jmp    1628 <main+0x468>
jmp    1634 <main+0x474>
mov    $0x0,%al
call   10a0 <usage@plt>
jmp    142e <main+0x26e>
mov    0x2988(%rip),%rax
mov    (%rax),%rcx
movslq -0x8(%rbp),%rax
sub    %rcx,%rax
mov    %eax,-0x8(%rbp)
mov    0x2974(%rip),%rax
mov    (%rax),%rax
shl    $0x3,%rax
add    -0x10(%rbp),%rax
mov    %rax,-0x10(%rbp)
cmpl   $0x1,-0x8(%rbp)
jg     1681 <main+0x4c1>
cmpl   $0x0,-0x14(%rbp)
je     1688 <main+0x4c8>
cmpl   $0x0,-0x18(%rbp)
je     1688 <main+0x4c8>
mov    $0x0,%al
call   10a0 <usage@plt>
cmpl   $0x0,-0x8(%rbp)
jle    1797 <main+0x5d7>
mov    -0x10(%rbp),%rax
mov    (%rax),%rdi
mov    0x2938(%rip),%rax
mov    (%rax),%rdx
lea    0x95c(%rip),%rsi
call   1050 <freopen@plt>
mov    0x2922(%rip),%rcx
cmp    (%rcx),%rax
je     1708 <main+0x548>
mov    0x28f2(%rip),%rax
mov    (%rax),%esi
lea    0x939(%rip),%rdi
call   1040 <fputs@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%rdi
mov    0x28d6(%rip),%rax
mov    (%rax),%esi
call   1040 <fputs@plt>
mov    0x28c8(%rip),%rax
mov    (%rax),%esi
lea    0x925(%rip),%rdi
call   1040 <fputs@plt>
mov    $0x1,%edi
call   10d0 <exit@plt>
cmpl   $0x0,-0x20(%rbp)
jge    1792 <main+0x5d2>
mov    0x28bf(%rip),%rax
mov    (%rax),%rdi
call   1070 <fileno@plt>
mov    %eax,%edi
lea    -0x38(%rbp),%rsi
call   10e0 <fstat@plt>
cmp    $0x0,%rax
jne    1792 <main+0x5d2>
cmpl   $0x0,-0x14(%rbp)
je     174d <main+0x58d>
movslq -0x20(%rbp),%rax
mov    %rax,-0x50(%rbp)
jmp    1759 <main+0x599>
movslq -0x20(%rbp),%rax
shl    $0xb,%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x40(%rbp)
xor    %eax,%eax
sub    -0x40(%rbp),%rax
cmp    -0x38(%rbp),%rax
jge    178d <main+0x5cd>
mov    0x2860(%rip),%rax
mov    (%rax),%rdi
mov    -0x40(%rbp),%rsi
mov    0x285a(%rip),%rax
mov    (%rax),%edx
call   1090 <fseek@plt>
jmp    1792 <main+0x5d2>
jmp    179e <main+0x5de>
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%edi
mov    -0x14(%rbp),%esi
mov    -0x1c(%rbp),%edx
call   1080 <tail@plt>
mov    %eax,%edi
call   10d0 <exit@plt>

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
cmp    $0x1,%edi
jne    11e1 <main+0x21>
mov    $0xfffffff6,%edi
xor    %esi,%esi
xor    %edx,%edx
jmp    155b <main+0x39b>
mov    %rsi,%rbx
mov    %edi,%r12d
lea    0x8(%rsi),%r14
mov    0x8(%rsi),%rcx
mov    (%rcx),%al
cmp    $0x2b,%al
je     121b <main+0x5b>
cmp    $0x2d,%al
jne    124e <main+0x8e>
movsbl 0x1(%rcx),%edi
call   1030 <isdigit@plt>
mov    (%r14),%rcx
test   %rax,%rax
jne    121b <main+0x5b>
mov    0x1(%rcx),%al
cmp    $0x6c,%al
je     121b <main+0x5b>
cmp    $0x63,%al
jne    124e <main+0x8e>
cmpb   $0x66,0x2(%rcx)
jne    124e <main+0x8e>
movsbl 0x1(%rcx),%edi
call   1030 <isdigit@plt>
mov    (%r14),%rdi
test   %rax,%rax
jne    12b2 <main+0xf2>
cmpb   $0x2b,(%rdi)
mov    $0xa,%eax
mov    $0xfffffff6,%ebp
cmove  %eax,%ebp
add    $0x1,%rdi
mov    %rdi,0x8(%rsp)
jmp    12d9 <main+0x119>
lea    0xdab(%rip),%rdx
mov    %r12d,%r14d
mov    %r12d,%edi
mov    %rbx,%rsi
call   10b0 <getopt@plt>
mov    0x2d66(%rip),%rcx
cmp    (%rcx),%eax
jne    1300 <main+0x140>
mov    $0xfffffff6,%ebp
xor    %r13d,%r13d
xor    %r15d,%r15d
movl   $0x0,0x4(%rsp)
mov    0x2d3c(%rip),%rax
mov    (%rax),%rax
mov    %r14d,%r12d
sub    %eax,%r12d
lea    (%rbx,%rax,8),%r14
mov    0x4(%rsp),%eax
mov    %r13d,%esi
mov    %eax,%r13d
cmp    $0x1,%r12d
jle    14cb <main+0x30b>
jmp    14d4 <main+0x314>
lea    0x8(%rsp),%rsi
mov    $0xa,%edx
call   1060 <strtol@plt>
mov    %rax,%rbp
test   %ebp,%ebp
jne    12d9 <main+0x119>
mov    (%r14),%rax
mov    $0x1,%ebp
cmpb   $0x2b,(%rax)
jne    1461 <main+0x2a1>
mov    0x8(%rsp),%rcx
mov    (%rcx),%dl
xor    %eax,%eax
cmp    $0x63,%dl
je     1468 <main+0x2a8>
cmp    $0x6c,%dl
jne    147b <main+0x2bb>
mov    $0x1,%eax
xor    %esi,%esi
jmp    146d <main+0x2ad>
mov    $0xfffffff6,%ebp
lea    0xcf4(%rip),%r12
movl   $0x0,0x4(%rsp)
xor    %r15d,%r15d
xor    %r13d,%r13d
jmp    1344 <main+0x184>
nopl   0x0(%rax)
xor    %eax,%eax
call   10a0 <usage@plt>
mov    %r14d,%edi
mov    %rbx,%rsi
mov    %r12,%rdx
call   10b0 <getopt@plt>
mov    0x2c94(%rip),%rcx
cmp    (%rcx),%eax
je     1285 <main+0xc5>
cmp    $0x6e,%eax
je     1380 <main+0x1c0>
cmp    $0x66,%eax
je     13b0 <main+0x1f0>
cmp    $0x63,%eax
jne    1320 <main+0x160>
mov    0x2c9e(%rip),%rax
mov    (%rax),%rdi
movzbl (%rdi),%eax
cmp    $0x2d,%al
je     1368 <main+0x1a8>
cmp    $0x2b,%al
jne    13bd <main+0x1fd>
call   10c0 <atoi@plt>
mov    %eax,%ebp
test   %ebp,%ebp
jne    13e1 <main+0x221>
jmp    1426 <main+0x266>
nopl   0x0(%rax,%rax,1)
mov    0x2c71(%rip),%rax
mov    (%rax),%rdi
movzbl (%rdi),%eax
cmp    $0x2d,%al
je     1395 <main+0x1d5>
cmp    $0x2b,%al
jne    13ec <main+0x22c>
call   10c0 <atoi@plt>
mov    %eax,%ebp
test   %ebp,%ebp
jne    1410 <main+0x250>
jmp    1443 <main+0x283>
cs nopw 0x0(%rax,%rax,1)
nop
movl   $0x1,0x4(%rsp)
jmp    1327 <main+0x167>
movsbl %al,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     141b <main+0x25b>
mov    0x2c27(%rip),%rax
mov    (%rax),%rdi
call   10c0 <atoi@plt>
mov    %eax,%ebp
neg    %ebp
test   %ebp,%ebp
je     1426 <main+0x266>
mov    $0x1,%r13d
jmp    1327 <main+0x167>
movsbl %al,%edi
call   1030 <isdigit@plt>
test   %rax,%rax
je     1438 <main+0x278>
mov    0x2bf8(%rip),%rax
mov    (%rax),%rdi
call   10c0 <atoi@plt>
mov    %eax,%ebp
neg    %ebp
test   %ebp,%ebp
je     1443 <main+0x283>
mov    $0x1,%r15d
jmp    1327 <main+0x167>
xor    %eax,%eax
call   10a0 <usage@plt>
test   %ebp,%ebp
jne    13e1 <main+0x221>
mov    0x2bcb(%rip),%rax
mov    (%rax),%rax
mov    $0x1,%r13d
jmp    1453 <main+0x293>
xor    %eax,%eax
call   10a0 <usage@plt>
test   %ebp,%ebp
jne    1410 <main+0x250>
mov    0x2bae(%rip),%rax
mov    (%rax),%rax
mov    $0x1,%r15d
cmpb   $0x2b,(%rax)
mov    $0x1,%ebp
je     1327 <main+0x167>
xor    %edi,%edi
call   10d0 <exit@plt>
mov    $0x1,%esi
mov    %eax,%r15d
mov    0x1(%rcx),%dl
add    $0x1,%rcx
mov    %esi,%eax
jmp    147e <main+0x2be>
xor    %r15d,%r15d
mov    $0x0,%r13d
cmp    $0x66,%dl
jne    149b <main+0x2db>
lea    0x1(%rcx),%rdx
mov    %rdx,0x8(%rsp)
mov    0x1(%rcx),%dl
mov    $0x1,%r13d
test   %dl,%dl
jne    14b4 <main+0x2f4>
add    $0xfffffffe,%r12d
add    $0x10,%rbx
mov    %eax,%esi
mov    %rbx,%r14
cmp    $0x1,%r12d
jle    14cb <main+0x30b>
jmp    14d4 <main+0x314>
add    $0xffffffff,%r12d
mov    $0xfffffff6,%ebp
xor    %r15d,%r15d
xor    %r13d,%r13d
xor    %esi,%esi
cmp    $0x1,%r12d
jg     14d4 <main+0x314>
test   %esi,%esi
je     14df <main+0x31f>
test   %r15d,%r15d
je     14df <main+0x31f>
mov    %esi,%ebx
xor    %eax,%eax
call   10a0 <usage@plt>
mov    %ebx,%esi
xor    %edx,%edx
test   %r12d,%r12d
jle    1559 <main+0x399>
mov    %esi,%r15d
mov    (%r14),%rdi
mov    0x2ae5(%rip),%rbx
mov    (%rbx),%rdx
lea    0xb09(%rip),%rsi
call   1050 <freopen@plt>
cmp    (%rbx),%rax
jne    1567 <main+0x3a7>
test   %ebp,%ebp
jns    1553 <main+0x393>
mov    %rax,%rdi
call   1070 <fileno@plt>
lea    0x10(%rsp),%rsi
mov    %eax,%edi
call   10e0 <fstat@plt>
test   %rax,%rax
jne    1553 <main+0x393>
movslq %ebp,%rax
mov    %rax,%rsi
shl    $0xb,%rsi
test   %r15d,%r15d
cmovne %rax,%rsi
mov    %rsi,%rax
neg    %rax
cmp    %rax,0x10(%rsp)
jle    1553 <main+0x393>
mov    (%rbx),%rdi
mov    0x2a94(%rip),%rax
mov    (%rax),%edx
call   1090 <fseek@plt>
mov    %r13d,%edx
mov    %r15d,%esi
mov    %ebp,%edi
call   1080 <tail@plt>
mov    %eax,%edi
call   10d0 <exit@plt>
mov    0x2a4a(%rip),%rbx
mov    (%rbx),%esi
lea    0xa91(%rip),%rdi
call   1040 <fputs@plt>
mov    (%r14),%rdi
mov    (%rbx),%esi
call   1040 <fputs@plt>
mov    (%rbx),%esi
lea    0xa8f(%rip),%rdi
call   1040 <fputs@plt>
mov    $0x1,%edi
call   10d0 <exit@plt>

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

LLVM IR (-O2):
%struct.stat = type { i64 }
@.str = [6 x i8] c"c:fn:\00"
@EOF = global i32 0
@optarg = global i8* null
@optind = global i64 0
@.str.1 = [2 x i8] c"r\00"
@stdin = global i64 0
@.str.2 = [22 x i8] c"tail: could not open \00"
@stderr = global i32 0
@.str.3 = [2 x i8] c"\0A\00"
@SEEK_END = global i32 0
define i32 @main(i32 %0, i8** %1) {
%3 = alloca i8*
%4 = alloca %struct.stat
%5 = bitcast i8** %3 to i8*
%6 = bitcast %struct.stat* %4 to i8*
%7 = icmp eq i32 %0, 1
br i1 %7, label %8, label %11
8: ; preds = %2
%9 = tail call i32 @tail(i32 -10, i32 0, i32 0)
%10 = tail call i32 @exit(i32 %9)
unreachable
11: ; preds = %2
%12 = getelementptr inbounds i8*, i8** %1, i64 1
%13 = load i8*, i8** %12
%14 = load i8, i8* %13
switch i8 %14, label %77 [
i8 43, label %28
i8 45, label %15
]
15: ; preds = %11
%16 = getelementptr inbounds i8, i8* %13, i64 1
%17 = load i8, i8* %16
%18 = tail call i64 @isdigit(i8 signext %17)
%19 = icmp eq i64 %18, 0
%20 = load i8*, i8** %12
br i1 %19, label %21, label %28
21: ; preds = %15
%22 = getelementptr inbounds i8, i8* %20, i64 1
%23 = load i8, i8* %22
switch i8 %23, label %77 [
i8 108, label %28
i8 99, label %24
]
24: ; preds = %21
%25 = getelementptr inbounds i8, i8* %20, i64 2
%26 = load i8, i8* %25
%27 = icmp eq i8 %26, 102
br i1 %27, label %28, label %77
28: ; preds = %15, %21, %11, %24
%29 = phi i8* [ %20, %21 ], [ %13, %11 ], [ %20, %24 ], [ %20, %15 ]
%30 = add nsw i32 %0, -1
%31 = getelementptr inbounds i8, i8* %29, i64 1
%32 = load i8, i8* %31
%33 = tail call i64 @isdigit(i8 signext %32)
%34 = icmp eq i64 %33, 0
%35 = load i8*, i8** %12
br i1 %34, label %46, label %36
36: ; preds = %28
%37 = call i64 @strtol(i8* %35, i8** %3, i32 10)
%38 = trunc i64 %37 to i32
%39 = icmp eq i32 %38, 0
br i1 %39, label %40, label %51
40: ; preds = %36
%41 = load i8*, i8** %12
%42 = load i8, i8* %41
%43 = icmp eq i8 %42, 43
br i1 %43, label %51, label %44
44: ; preds = %40
%45 = tail call i32 @exit(i32 0)
unreachable
46: ; preds = %28
%47 = load i8, i8* %35
%48 = icmp eq i8 %47, 43
%49 = select i1 %48, i32 10, i32 -10
%50 = getelementptr inbounds i8, i8* %35, i64 1
store i8* %50, i8** %3
br label %51
51: ; preds = %40, %36, %46
%52 = phi i32 [ %38, %36 ], [ %49, %46 ], [ 1, %40 ]
%53 = load i8*, i8** %3
%54 = load i8, i8* %53
switch i8 %54, label %61 [
i8 108, label %55
i8 99, label %56
]
55: ; preds = %51
br label %56
56: ; preds = %51, %55
%57 = phi i32 [ 0, %55 ], [ 1, %51 ]
%58 = phi i32 [ 1, %55 ], [ 0, %51 ]
%59 = getelementptr inbounds i8, i8* %53, i64 1
%60 = load i8, i8* %59
br label %61
61: ; preds = %56, %51
%62 = phi i8 [ %60, %56 ], [ %54, %51 ]
%63 = phi i8* [ %59, %56 ], [ %53, %51 ]
%64 = phi i32 [ %57, %56 ], [ 0, %51 ]
%65 = phi i32 [ %58, %56 ], [ 0, %51 ]
%66 = icmp eq i8 %62, 102
br i1 %66, label %67, label %70
67: ; preds = %61
%68 = getelementptr inbounds i8, i8* %63, i64 1
store i8* %68, i8** %3
%69 = load i8, i8* %68
br label %70
70: ; preds = %61, %67
%71 = phi i8 [ %69, %67 ], [ %62, %61 ]
%72 = phi i32 [ 1, %67 ], [ 0, %61 ]
%73 = icmp eq i8 %71, 0
br i1 %73, label %74, label %152
74: ; preds = %70
%75 = add nsw i32 %0, -2
%76 = getelementptr inbounds i8*, i8** %1, i64 2
br label %152
77: ; preds = %21, %11, %24
%78 = tail call i32 @getopt(i32 %0, i8** %1, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%79 = load i32, i32* @EOF
%80 = icmp eq i32 %78, %79
br i1 %80, label %143, label %81
81: ; preds = %77, %135
%82 = phi i32 [ %140, %135 ], [ %78, %77 ]
%83 = phi i32 [ %139, %135 ], [ -10, %77 ]
%84 = phi i32 [ %138, %135 ], [ 0, %77 ]
%85 = phi i32 [ %137, %135 ], [ 0, %77 ]
%86 = phi i32 [ %136, %135 ], [ 0, %77 ]
switch i32 %82, label %133 [
i32 99, label %87
i32 102, label %135
i32 110, label %110
]
87: ; preds = %81
%88 = load i8*, i8** @optarg
%89 = load i8, i8* %88
switch i8 %89, label %92 [
i8 43, label %90
i8 45, label %90
]
90: ; preds = %87, %87
%91 = tail call i32 @atoi(i8* %88)
br label %101
92: ; preds = %87
%93 = tail call i64 @isdigit(i8 signext %89)
%94 = icmp eq i64 %93, 0
br i1 %94, label %99, label %95
95: ; preds = %92
%96 = load i8*, i8** @optarg
%97 = tail call i32 @atoi(i8* %96)
%98 = sub nsw i32 0, %97
br label %101
99: ; preds = %92
%100 = tail call i32 (...) @usage()
br label %101
101: ; preds = %95, %99, %90
%102 = phi i32 [ %91, %90 ], [ %98, %95 ], [ %83, %99 ]
%103 = icmp eq i32 %102, 0
br i1 %103, label %104, label %135
104: ; preds = %101
%105 = load i8*, i8** @optarg
%106 = load i8, i8* %105
%107 = icmp eq i8 %106, 43
br i1 %107, label %135, label %108
108: ; preds = %104
%109 = tail call i32 @exit(i32 0)
unreachable
110: ; preds = %81
%111 = load i8*, i8** @optarg
%112 = load i8, i8* %111
switch i8 %112, label %115 [
i8 43, label %113
i8 45, label %113
]
113: ; preds = %110, %110
%114 = tail call i32 @atoi(i8* %111)
br label %124
115: ; preds = %110
%116 = tail call i64 @isdigit(i8 signext %112)
%117 = icmp eq i64 %116, 0
br i1 %117, label %122, label %118
118: ; preds = %115
%119 = load i8*, i8** @optarg
%120 = tail call i32 @atoi(i8* %119)
%121 = sub nsw i32 0, %120
br label %124
122: ; preds = %115
%123 = tail call i32 (...) @usage()
br label %124
124: ; preds = %118, %122, %113
%125 = phi i32 [ %114, %113 ], [ %121, %118 ], [ %83, %122 ]
%126 = icmp eq i32 %125, 0
br i1 %126, label %127, label %135
127: ; preds = %124
%128 = load i8*, i8** @optarg
%129 = load i8, i8* %128
%130 = icmp eq i8 %129, 43
br i1 %130, label %135, label %131
131: ; preds = %127
%132 = tail call i32 @exit(i32 0)
unreachable
133: ; preds = %81
%134 = tail call i32 (...) @usage()
br label %135
135: ; preds = %127, %81, %104, %124, %101, %133
%136 = phi i32 [ %86, %133 ], [ %86, %124 ], [ 1, %101 ], [ 1, %104 ], [ %86, %81 ], [ %86, %127 ]
%137 = phi i32 [ %85, %133 ], [ 1, %124 ], [ %85, %101 ], [ %85, %104 ], [ %85, %81 ], [ 1, %127 ]
%138 = phi i32 [ %84, %133 ], [ %84, %124 ], [ %84, %101 ], [ %84, %104 ], [ 1, %81 ], [ %84, %127 ]
%139 = phi i32 [ %83, %133 ], [ %125, %124 ], [ %102, %101 ], [ 1, %104 ], [ %83, %81 ], [ 1, %127 ]
%140 = tail call i32 @getopt(i32 %0, i8** %1, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%141 = load i32, i32* @EOF
%142 = icmp eq i32 %140, %141
br i1 %142, label %143, label %81
143: ; preds = %135, %77
%144 = phi i32 [ 0, %77 ], [ %136, %135 ]
%145 = phi i32 [ 0, %77 ], [ %137, %135 ]
%146 = phi i32 [ 0, %77 ], [ %138, %135 ]
%147 = phi i32 [ -10, %77 ], [ %139, %135 ]
%148 = load i64, i64* @optind
%149 = trunc i64 %148 to i32
%150 = sub i32 %0, %149
%151 = getelementptr inbounds i8*, i8** %1, i64 %148
br label %152
152: ; preds = %70, %74, %143
%153 = phi i32 [ %64, %74 ], [ %144, %143 ], [ 0, %70 ]
%154 = phi i32 [ %65, %74 ], [ %145, %143 ], [ 0, %70 ]
%155 = phi i32 [ %72, %74 ], [ %146, %143 ], [ 0, %70 ]
%156 = phi i32 [ %52, %74 ], [ %147, %143 ], [ -10, %70 ]
%157 = phi i8** [ %76, %74 ], [ %151, %143 ], [ %12, %70 ]
%158 = phi i32 [ %75, %74 ], [ %150, %143 ], [ %30, %70 ]
%159 = icmp sgt i32 %158, 1
br i1 %159, label %164, label %160
160: ; preds = %152
%161 = icmp ne i32 %153, 0
%162 = icmp ne i32 %154, 0
%163 = select i1 %161, i1 %162, i1 false
br i1 %163, label %164, label %166
164: ; preds = %160, %152
%165 = tail call i32 (...) @usage()
br label %166
166: ; preds = %164, %160
%167 = icmp sgt i32 %158, 0
br i1 %167, label %168, label %202
168: ; preds = %166
%169 = load i8*, i8** %157
%170 = load i64, i64* @stdin
%171 = tail call i64 @freopen(i8* %169, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0), i64 %170)
%172 = load i64, i64* @stdin
%173 = icmp eq i64 %171, %172
br i1 %173, label %183, label %174
174: ; preds = %168
%175 = load i32, i32* @stderr
%176 = tail call i32 @fputs(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.2, i64 0, i64 0), i32 %175)
%177 = load i8*, i8** %157
%178 = load i32, i32* @stderr
%179 = tail call i32 @fputs(i8* %177, i32 %178)
%180 = load i32, i32* @stderr
%181 = tail call i32 @fputs(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i64 0, i64 0), i32 %180)
%182 = tail call i32 @exit(i32 1)
unreachable
183: ; preds = %168
%184 = icmp slt i32 %156, 0
br i1 %184, label %185, label %202
185: ; preds = %183
%186 = tail call i32 @fileno(i64 %171)
%187 = call i64 @fstat(i32 %186, %struct.stat* %4)
%188 = icmp eq i64 %187, 0
br i1 %188, label %189, label %202
189: ; preds = %185
%190 = icmp eq i32 %153, 0
%191 = sext i32 %156 to i64
%192 = shl nsw i64 %191, 11
%193 = select i1 %190, i64 %192, i64 %191
%194 = sub nsw i64 0, %193
%195 = getelementptr inbounds %struct.stat, %struct.stat* %4, i64 0, i32 0
%196 = load i64, i64* %195
%197 = icmp sgt i64 %196, %194
br i1 %197, label %198, label %202
198: ; preds = %189
%199 = load i64, i64* @stdin
%200 = load i32, i32* @SEEK_END
%201 = tail call i32 @fseek(i64 %199, i64 %193, i32 %200)
br label %202
202: ; preds = %166, %189, %198, %183, %185
%203 = phi i32 [ %155, %185 ], [ %155, %183 ], [ %155, %198 ], [ %155, %189 ], [ 0, %166 ]
%204 = tail call i32 @tail(i32 %156, i32 %153, i32 %203)
%205 = tail call i32 @exit(i32 %204)
unreachable
}