#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*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ SEEK_END;
int /*<<< orphan*/ SEEK_SET;
int /*<<< orphan*/ fclose(int /*<<< orphan*/ *);
int /*<<< orphan*/ *fopen(char *, char *);
size_t fread(char *, int, size_t, int /*<<< orphan*/ *);
int /*<<< orphan*/ free(char *);
int /*<<< orphan*/ fseek(int /*<<< orphan*/ *, int /*<<< orphan*/,
                         int /*<<< orphan*/);
size_t ftell(int /*<<< orphan*/ *);
size_t fwrite(char *, int, size_t, int /*<<< orphan*/ *);
char *malloc(int);
int /*<<< orphan*/ printf(char *, ...);
size_t strlen(char *);
int main(int argc, char *argv[]) {
  int rc = 0, filename_start = 0, counter = 0;
  int i = 0, j = 0, k = 0, l = 0;
  size_t filesize = 0, filename_size = 0;
  char *filename = NULL, *filedata = NULL;
  char *filename_alpha = NULL, *alpha = NULL;
  FILE *infile = NULL, *outfile = NULL;
  if (argc < 2) {
    printf("aahlp, v%s\n", "1.0.1");
    printf("Copyright (C)  2014, Kevin Selwyn <kevinselwyn@gmail.com>\n\n");
    printf("Usage: %s <infile>\n\n", argv[0]);
    rc = 1;
    goto cleanup;
  }
  filename = argv[1];
  infile = fopen(filename, "rb");
  if (!infile) {
    printf("Could not open %s\n", filename);
    rc = 1;
    goto cleanup;
  }
  fseek(infile, 0, SEEK_END);
  filesize = ftell(infile);
  fseek(infile, 0, SEEK_SET);
  if (!filesize) {
    printf("%s is empty\n", filename);
    rc = 1;
    goto cleanup;
  }
  filedata = malloc(sizeof(char) * filesize + 1);
  alpha = malloc(sizeof(char) * filesize + 1);
  if (!filedata || !alpha) {
    printf("Memory error\n");
    rc = 1;
    goto cleanup;
  }
  if (fread(filedata, 1, filesize, infile) != filesize) {
    printf("Could not read %s\n", filename);
    rc = 1;
    goto cleanup;
  }
  for (i = 0, j = 26, counter = 0; i < j; i++) {
    for (k = 0, l = filesize; k < l; k++) {
      if (filedata[k] == 65 + i || filedata[k] == 97 + i) {
        alpha[counter++] = filedata[k];
      }
    }
  }
  for (i = 0, l = filesize, counter = 0; i < l; i++) {
    if ((filedata[i] >= 65 && filedata[i] <= 90) ||
        (filedata[i] >= 97 && filedata[i] <= 122)) {
      filedata[i] = alpha[counter++];
    }
  }
  filename_size = strlen(filename);
  filename_alpha = malloc(sizeof(char) * filename_size + 1);
  if (!filename_alpha) {
    printf("Memory error\n");
    rc = 1;
    goto cleanup;
  }
  for (i = filename_size - 1, l = 0; i >= l; i--) {
    if (filename[i] == '/') {
      filename_start = i;
      i = l;
    }
  }
  for (i = 0, j = 26, counter = 0; i < j; i++) {
    for (k = filename_start, l = filename_size; k < l; k++) {
      if (filename[k] == 65 + i || filename[k] == 97 + i) {
        filename_alpha[counter++] = filename[k];
      }
    }
  }
  for (i = filename_start, l = filename_size, counter = 0; i < l; i++) {
    if ((filename[i] >= 65 && filename[i] <= 90) ||
        (filename[i] >= 97 && filename[i] <= 122)) {
      filename[i] = filename_alpha[counter++];
    }
  }
  outfile = fopen(filename, "w+");
  if (!outfile) {
    printf("Could not open %s\n", filename);
    rc = 1;
    goto cleanup;
  }
  if (fwrite(filedata, 1, filesize, outfile) != filesize) {
    printf("Could not write %s\n", filename);
    rc = 1;
    goto cleanup;
  }
cleanup:
  if (infile) {
    fclose(infile);
  }
  if (outfile) {
    fclose(outfile);
  }
  if (filedata) {
    free(filedata);
  }
  if (alpha) {
    free(alpha);
  }
  if (filename_alpha) {
    free(filename_alpha);
  }
  return rc;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%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   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movq   $0x0,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
movq   $0x0,-0x48(%rbp)
movq   $0x0,-0x50(%rbp)
movq   $0x0,-0x58(%rbp)
movq   $0x0,-0x60(%rbp)
movq   $0x0,-0x68(%rbp)
movq   $0x0,-0x70(%rbp)
cmpl   $0x2,-0x8(%rbp)
jge    1275 <main+0xd5>
lea    0xdc8(%rip),%rdi
lea    0xdcd(%rip),%rsi
mov    $0x0,%al
call   1070 <printf@plt>
lea    0xdc5(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%rsi
lea    0xdec(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
movl   $0x1,-0x14(%rbp)
jmp    178b <main+0x5eb>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rdi
lea    0xdd7(%rip),%rsi
call   10b0 <fopen@plt>
mov    %rax,-0x68(%rbp)
cmpq   $0x0,-0x68(%rbp)
jne    12be <main+0x11e>
mov    -0x48(%rbp),%rsi
lea    0xdbb(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
movl   $0x1,-0x14(%rbp)
jmp    178b <main+0x5eb>
mov    -0x68(%rbp),%rdi
mov    0x2d1f(%rip),%rax
mov    (%rax),%edx
xor    %esi,%esi
call   10a0 <fseek@plt>
mov    -0x68(%rbp),%rdi
call   1080 <ftell@plt>
mov    %rax,-0x38(%rbp)
mov    -0x68(%rbp),%rdi
mov    0x2cee(%rip),%rax
mov    (%rax),%edx
xor    %esi,%esi
call   10a0 <fseek@plt>
cmpq   $0x0,-0x38(%rbp)
jne    131c <main+0x17c>
mov    -0x48(%rbp),%rsi
lea    0xd70(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
movl   $0x1,-0x14(%rbp)
jmp    178b <main+0x5eb>
mov    -0x38(%rbp),%rax
shl    $0x0,%rax
add    $0x1,%rax
mov    %eax,%edi
call   1090 <malloc@plt>
mov    %rax,-0x50(%rbp)
mov    -0x38(%rbp),%rax
shl    $0x0,%rax
add    $0x1,%rax
mov    %eax,%edi
call   1090 <malloc@plt>
mov    %rax,-0x60(%rbp)
cmpq   $0x0,-0x50(%rbp)
je     1360 <main+0x1c0>
cmpq   $0x0,-0x60(%rbp)
jne    137a <main+0x1da>
lea    0xd1f(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
movl   $0x1,-0x14(%rbp)
jmp    178b <main+0x5eb>
mov    -0x50(%rbp),%rdi
mov    -0x38(%rbp),%rdx
mov    -0x68(%rbp),%rcx
mov    $0x1,%esi
call   1040 <fread@plt>
cmp    -0x38(%rbp),%rax
je     13b8 <main+0x218>
mov    -0x48(%rbp),%rsi
lea    0xcef(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
movl   $0x1,-0x14(%rbp)
jmp    178b <main+0x5eb>
movl   $0x0,-0x20(%rbp)
movl   $0x1a,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    146d <main+0x2cd>
movl   $0x0,-0x28(%rbp)
mov    -0x38(%rbp),%rax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    145a <main+0x2ba>
mov    -0x50(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x20(%rbp),%ecx
add    $0x41,%ecx
cmp    %ecx,%eax
je     1427 <main+0x287>
mov    -0x50(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x20(%rbp),%ecx
add    $0x61,%ecx
cmp    %ecx,%eax
jne    1447 <main+0x2a7>
mov    -0x50(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x60(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    144c <main+0x2ac>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    13e7 <main+0x247>
jmp    145f <main+0x2bf>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    13cd <main+0x22d>
movl   $0x0,-0x20(%rbp)
mov    -0x38(%rbp),%rax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1515 <main+0x375>
mov    -0x50(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     14b8 <main+0x318>
mov    -0x50(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jle    14e2 <main+0x342>
mov    -0x50(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1502 <main+0x362>
mov    -0x50(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     1502 <main+0x362>
mov    -0x60(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x50(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1507 <main+0x367>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1482 <main+0x2e2>
mov    -0x48(%rbp),%rdi
call   1060 <strlen@plt>
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
shl    $0x0,%rax
add    $0x1,%rax
mov    %eax,%edi
call   1090 <malloc@plt>
mov    %rax,-0x58(%rbp)
cmpq   $0x0,-0x58(%rbp)
jne    155e <main+0x3be>
lea    0xb3b(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
movl   $0x1,-0x14(%rbp)
jmp    178b <main+0x5eb>
mov    -0x40(%rbp),%rax
sub    $0x1,%rax
mov    %eax,-0x20(%rbp)
movl   $0x0,-0x2c(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jl     15b0 <main+0x410>
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2f,%eax
jne    159d <main+0x3fd>
mov    -0x20(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    15a2 <main+0x402>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1570 <main+0x3d0>
movl   $0x0,-0x20(%rbp)
movl   $0x1a,-0x24(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1664 <main+0x4c4>
mov    -0x18(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x40(%rbp),%rax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    1651 <main+0x4b1>
mov    -0x48(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x20(%rbp),%ecx
add    $0x41,%ecx
cmp    %ecx,%eax
je     161e <main+0x47e>
mov    -0x48(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x20(%rbp),%ecx
add    $0x61,%ecx
cmp    %ecx,%eax
jne    163e <main+0x49e>
mov    -0x48(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x58(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1643 <main+0x4a3>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    15de <main+0x43e>
jmp    1656 <main+0x4b6>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    15c5 <main+0x425>
mov    -0x18(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x40(%rbp),%rax
mov    %eax,-0x2c(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    170b <main+0x56b>
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     16ae <main+0x50e>
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jle    16d8 <main+0x538>
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     16f8 <main+0x558>
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7a,%eax
jg     16f8 <main+0x558>
mov    -0x58(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    16fd <main+0x55d>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1678 <main+0x4d8>
mov    -0x48(%rbp),%rdi
lea    0x991(%rip),%rsi
call   10b0 <fopen@plt>
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
jne    1748 <main+0x5a8>
mov    -0x48(%rbp),%rsi
lea    0x931(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
movl   $0x1,-0x14(%rbp)
jmp    178b <main+0x5eb>
mov    -0x50(%rbp),%rdi
mov    -0x38(%rbp),%rdx
mov    -0x70(%rbp),%rcx
mov    $0x1,%esi
call   10c0 <fwrite@plt>
cmp    -0x38(%rbp),%rax
je     1786 <main+0x5e6>
mov    -0x48(%rbp),%rsi
lea    0x937(%rip),%rdi
mov    $0x0,%al
call   1070 <printf@plt>
movl   $0x1,-0x14(%rbp)
jmp    178b <main+0x5eb>
jmp    178b <main+0x5eb>
cmpq   $0x0,-0x68(%rbp)
je     179f <main+0x5ff>
mov    -0x68(%rbp),%rdi
call   1050 <fclose@plt>
cmpq   $0x0,-0x70(%rbp)
je     17b3 <main+0x613>
mov    -0x70(%rbp),%rdi
call   1050 <fclose@plt>
cmpq   $0x0,-0x50(%rbp)
je     17c7 <main+0x627>
mov    -0x50(%rbp),%rdi
call   1030 <free@plt>
cmpq   $0x0,-0x60(%rbp)
je     17db <main+0x63b>
mov    -0x60(%rbp),%rdi
call   1030 <free@plt>
cmpq   $0x0,-0x58(%rbp)
je     17ef <main+0x64f>
mov    -0x58(%rbp),%rdi
call   1030 <free@plt>
mov    -0x14(%rbp),%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rsi,%rbx
cmp    $0x1,%edi
jg     11f6 <main+0x46>
lea    0xe33(%rip),%rdi
lea    0xe38(%rip),%rsi
xor    %eax,%eax
call   1080 <printf@plt>
lea    0xe9f(%rip),%rdi
call   1040 <puts@plt>
mov    (%rbx),%rsi
lea    0xe21(%rip),%rdi
jmp    1360 <main+0x1b0>
mov    0x8(%rbx),%rbp
lea    0xe26(%rip),%rsi
mov    %rbp,%rdi
call   10c0 <fopen@plt>
test   %rax,%rax
je     1356 <main+0x1a6>
mov    %rax,%r12
mov    0x2dcc(%rip),%rax
mov    (%rax),%edx
mov    %r12,%rdi
xor    %esi,%esi
call   10b0 <fseek@plt>
mov    %r12,%rdi
call   1090 <ftell@plt>
mov    %rax,%r13
mov    0x2d9e(%rip),%rax
mov    (%rax),%edx
mov    %r12,%rdi
xor    %esi,%esi
call   10b0 <fseek@plt>
test   %r13,%r13
je     1371 <main+0x1c1>
lea    0x1(%r13),%ebx
mov    %ebx,%edi
call   10a0 <malloc@plt>
mov    %rax,%r14
mov    %ebx,%edi
call   10a0 <malloc@plt>
test   %r14,%r14
mov    %rax,0x18(%rsp)
je     1399 <main+0x1e9>
test   %rax,%rax
je     1399 <main+0x1e9>
mov    $0x1,%ebx
mov    %r14,%rdi
mov    $0x1,%esi
mov    %r13,%rdx
mov    %r12,%rcx
call   1050 <fread@plt>
cmp    %r13,%rax
jne    13b2 <main+0x202>
mov    %r13d,%r9d
lea    -0x1(%r9),%r8
mov    %r13d,%r10d
and    $0x1,%r10d
mov    %r9,%rsi
sub    %r10,%rsi
xor    %eax,%eax
xor    %edi,%edi
mov    0x18(%rsp),%r11
mov    %eax,%ebx
nopl   0x0(%rax,%rax,1)
test   %r13d,%r13d
jg     12d2 <main+0x122>
add    $0x1,%ebx
cmp    $0x1a,%ebx
jne    12c0 <main+0x110>
jmp    1449 <main+0x299>
xor    %ecx,%ecx
test   %r8,%r8
jne    1323 <main+0x173>
test   %r10,%r10
je     12fb <main+0x14b>
movsbl (%r14,%rcx,1),%eax
mov    %ebx,%ecx
sub    %eax,%ecx
cmp    $0xffffffbf,%ecx
je     12f1 <main+0x141>
cmp    $0xffffff9f,%ecx
jne    12fb <main+0x14b>
movslq %edi,%rcx
add    $0x1,%edi
mov    %al,(%r11,%rcx,1)
lea    0x1(%rbx),%eax
cmp    $0x19,%ebx
jne    12b9 <main+0x109>
jmp    13cb <main+0x21b>
nopl   0x0(%rax,%rax,1)
movslq %edi,%rdx
add    $0x1,%edi
mov    %al,(%r11,%rdx,1)
add    $0x2,%rcx
cmp    %rcx,%rsi
je     12d9 <main+0x129>
movsbl (%r14,%rcx,1),%eax
mov    %ebx,%edx
sub    %eax,%edx
cmp    $0xffffffbf,%edx
je     1336 <main+0x186>
cmp    $0xffffff9f,%edx
jne    1340 <main+0x190>
movslq %edi,%rdx
add    $0x1,%edi
mov    %al,(%r11,%rdx,1)
movsbl 0x1(%r14,%rcx,1),%eax
mov    %ebx,%edx
sub    %eax,%edx
cmp    $0xffffffbf,%edx
je     1310 <main+0x160>
cmp    $0xffffff9f,%edx
jne    131a <main+0x16a>
jmp    1310 <main+0x160>
lea    0xccd(%rip),%rdi
mov    %rbp,%rsi
xor    %eax,%eax
call   1080 <printf@plt>
mov    $0x1,%ebx
jmp    16a7 <main+0x4f7>
lea    0xcc5(%rip),%rdi
xor    %r14d,%r14d
mov    %rbp,%rsi
xor    %eax,%eax
call   1080 <printf@plt>
mov    $0x1,%ebx
xor    %r15d,%r15d
xor    %eax,%eax
mov    %rax,0x18(%rsp)
jmp    1676 <main+0x4c6>
lea    0xcd4(%rip),%rdi
call   1040 <puts@plt>
mov    $0x1,%ebx
xor    %r15d,%r15d
jmp    1676 <main+0x4c6>
lea    0xc91(%rip),%rdi
xor    %r15d,%r15d
mov    %rbp,%rsi
xor    %eax,%eax
call   1080 <printf@plt>
jmp    1676 <main+0x4c6>
test   %r13d,%r13d
jle    1449 <main+0x299>
mov    %r13d,%edx
and    $0x1,%edx
test   %r8,%r8
je     1429 <main+0x279>
sub    %rdx,%r9
xor    %ecx,%ecx
xor    %esi,%esi
jmp    13ed <main+0x23d>
add    $0x2,%rcx
cmp    %rcx,%r9
je     142d <main+0x27d>
movzbl (%r14,%rcx,1),%eax
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x19,%al
ja     1409 <main+0x259>
movslq %esi,%rax
add    $0x1,%esi
movzbl (%r11,%rax,1),%eax
mov    %al,(%r14,%rcx,1)
movzbl 0x1(%r14,%rcx,1),%eax
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x19,%al
ja     13e4 <main+0x234>
movslq %esi,%rax
add    $0x1,%esi
movzbl (%r11,%rax,1),%eax
mov    %al,0x1(%r14,%rcx,1)
jmp    13e4 <main+0x234>
xor    %ecx,%ecx
xor    %esi,%esi
test   %rdx,%rdx
je     1449 <main+0x299>
mov    (%r14,%rcx,1),%al
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x19,%al
ja     1449 <main+0x299>
movslq %esi,%rax
mov    (%r11,%rax,1),%al
mov    %al,(%r14,%rcx,1)
mov    %r12,0x10(%rsp)
mov    %rbp,%rdi
call   1070 <strlen@plt>
mov    %rax,%r12
lea    0x1(%rax),%edi
call   10a0 <malloc@plt>
test   %rax,%rax
je     1569 <main+0x3b9>
mov    %rax,%r15
xor    %eax,%eax
mov    %r12d,%ecx
add    $0xffffffff,%ecx
mov    $0x0,%edx
js     14a6 <main+0x2f6>
xor    %edx,%edx
mov    $0xffffffff,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %ecx,%edi
cmpb   $0x2f,0x0(%rbp,%rdi,1)
cmove  %ecx,%edx
lea    -0x1(%rcx),%edi
cmove  %esi,%edi
mov    %edi,%ecx
test   %edi,%edi
jns    1490 <main+0x2e0>
movslq %edx,%r10
movslq %r12d,%r9
mov    %r9,%rcx
sub    %r10,%rcx
mov    %rcx,0x8(%rsp)
mov    %r10,%r11
not    %r11
add    %r9,%r11
lea    0x1(%r10),%rcx
mov    %rcx,0x20(%rsp)
xor    %ebx,%ebx
mov    %eax,%ecx
nopl   (%rax)
cmp    %r12d,%edx
jl     14e2 <main+0x332>
add    $0x1,%ecx
cmp    $0x1a,%ecx
jne    14d0 <main+0x320>
jmp    1608 <main+0x458>
testb  $0x1,0x8(%rsp)
jne    14ee <main+0x33e>
mov    %r10,%rax
jmp    1511 <main+0x361>
movsbl 0x0(%rbp,%r10,1),%eax
mov    %ecx,%esi
sub    %eax,%esi
cmp    $0xffffffbf,%esi
je     1502 <main+0x352>
cmp    $0xffffff9f,%esi
jne    150c <main+0x35c>
movslq %ebx,%rsi
add    $0x1,%ebx
mov    %al,(%r15,%rsi,1)
mov    0x20(%rsp),%rax
test   %r11,%r11
jne    1533 <main+0x383>
lea    0x1(%rcx),%eax
cmp    $0x19,%ecx
jne    14cb <main+0x31b>
jmp    157d <main+0x3cd>
movslq %ebx,%rdi
add    $0x1,%ebx
mov    %sil,(%r15,%rdi,1)
add    $0x2,%rax
cmp    %rax,%r9
je     1516 <main+0x366>
movsbl 0x0(%rbp,%rax,1),%esi
mov    %ecx,%r8d
sub    %esi,%r8d
cmp    $0xffffffbf,%r8d
je     154a <main+0x39a>
cmp    $0xffffff9f,%r8d
jne    1554 <main+0x3a4>
movslq %ebx,%rdi
add    $0x1,%ebx
mov    %sil,(%r15,%rdi,1)
movsbl 0x1(%rbp,%rax,1),%esi
mov    %ecx,%edi
sub    %esi,%edi
cmp    $0xffffffbf,%edi
je     1520 <main+0x370>
cmp    $0xffffff9f,%edi
jne    152a <main+0x37a>
jmp    1520 <main+0x370>
lea    0xb04(%rip),%rdi
call   1040 <puts@plt>
xor    %r15d,%r15d
jmp    166c <main+0x4bc>
cmp    %r12d,%edx
jge    1608 <main+0x458>
test   %r11,%r11
je     15e6 <main+0x436>
mov    0x8(%rsp),%rax
and    $0xfffffffffffffffe,%rax
xor    %ecx,%ecx
jmp    15a2 <main+0x3f2>
add    $0x2,%r10
add    $0xfffffffffffffffe,%rax
je     15e8 <main+0x438>
movzbl 0x0(%rbp,%r10,1),%edx
and    $0xdf,%dl
add    $0xbf,%dl
cmp    $0x19,%dl
ja     15c3 <main+0x413>
movslq %ecx,%rdx
add    $0x1,%ecx
movzbl (%r15,%rdx,1),%edx
mov    %dl,0x0(%rbp,%r10,1)
movzbl 0x1(%rbp,%r10,1),%edx
and    $0xdf,%dl
add    $0xbf,%dl
cmp    $0x19,%dl
ja     1598 <main+0x3e8>
movslq %ecx,%rdx
add    $0x1,%ecx
movzbl (%r15,%rdx,1),%edx
mov    %dl,0x1(%rbp,%r10,1)
jmp    1598 <main+0x3e8>
xor    %ecx,%ecx
testb  $0x1,0x8(%rsp)
je     1608 <main+0x458>
mov    0x0(%rbp,%r10,1),%al
and    $0xdf,%al
add    $0xbf,%al
cmp    $0x19,%al
ja     1608 <main+0x458>
movslq %ecx,%rax
mov    (%r15,%rax,1),%al
mov    %al,0x0(%rbp,%r10,1)
lea    0xa4e(%rip),%rsi
mov    %rbp,%rdi
call   10c0 <fopen@plt>
test   %rax,%rax
je     165b <main+0x4ab>
mov    %rax,%r12
mov    %r14,%rdi
mov    $0x1,%esi
mov    %r13,%rdx
mov    %rax,%rcx
call   10d0 <fwrite@plt>
xor    %ebx,%ebx
cmp    %r13,%rax
je     164f <main+0x49f>
lea    0xa20(%rip),%rdi
mov    %rbp,%rsi
xor    %eax,%eax
call   1080 <printf@plt>
mov    $0x1,%ebx
mov    0x10(%rsp),%rdi
call   1060 <fclose@plt>
jmp    1676 <main+0x4c6>
lea    0x9c8(%rip),%rdi
mov    %rbp,%rsi
xor    %eax,%eax
call   1080 <printf@plt>
mov    0x10(%rsp),%r12
mov    $0x1,%ebx
mov    %r12,%rdi
call   1060 <fclose@plt>
test   %r14,%r14
je     168b <main+0x4db>
mov    %r14,%rdi
call   1030 <free@plt>
mov    0x18(%rsp),%rdi
test   %rdi,%rdi
je     169a <main+0x4ea>
call   1030 <free@plt>
test   %r15,%r15
je     16a7 <main+0x4f7>
mov    %r15,%rdi
call   1030 <free@plt>
mov    %ebx,%eax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [12 x i8] c"aahlp, v%s\0A\00"
@.str.1 = [6 x i8] c"1.0.1\00"
@.str.2 = [60 x i8] c"Copyright (C) 2014, Kevin Selwyn <kevinselwyn@gmail.com>\0A\0A\00"
@.str.3 = [21 x i8] c"Usage: %s <infile>\0A\0A\00"
@.str.4 = [3 x i8] c"rb\00"
@.str.5 = [19 x i8] c"Could not open %s\0A\00"
@SEEK_END = global i32 0
@SEEK_SET = global i32 0
@.str.6 = [13 x i8] c"%s is empty\0A\00"
@.str.7 = [14 x i8] c"Memory error\0A\00"
@.str.8 = [19 x i8] c"Could not read %s\0A\00"
@.str.9 = [3 x i8] c"w+\00"
@.str.10 = [20 x i8] c"Could not write %s\0A\00"
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 i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i64
%14 = alloca i64
%15 = alloca i8*
%16 = alloca i8*
%17 = alloca i8*
%18 = alloca i8*
%19 = alloca i32*
%20 = alloca i32*
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 0, i32* %9
store i32 0, i32* %10
store i32 0, i32* %11
store i32 0, i32* %12
store i64 0, i64* %13
store i64 0, i64* %14
store i8* null, i8** %15
store i8* null, i8** %16
store i8* null, i8** %17
store i8* null, i8** %18
store i32* null, i32** %19
store i32* null, i32** %20
%21 = load i32, i32* %4
%22 = icmp slt i32 %21, 2
br i1 %22, label %23, label %30
23: ; preds = %2
%24 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i64 0, i64 0))
%25 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str.2, i64 0, i64 0))
%26 = load i8**, i8*** %5
%27 = getelementptr inbounds i8*, i8** %26, i64 0
%28 = load i8*, i8** %27
%29 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.3, i64 0, i64 0), i8* %28)
store i32 1, i32* %6
br label %349
30: ; preds = %2
%31 = load i8**, i8*** %5
%32 = getelementptr inbounds i8*, i8** %31, i64 1
%33 = load i8*, i8** %32
store i8* %33, i8** %15
%34 = load i8*, i8** %15
%35 = call i32* @fopen(i8* %34, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i64 0, i64 0))
store i32* %35, i32** %19
%36 = load i32*, i32** %19
%37 = icmp ne i32* %36, null
br i1 %37, label %41, label %38
38: ; preds = %30
%39 = load i8*, i8** %15
%40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.5, i64 0, i64 0), i8* %39)
store i32 1, i32* %6
br label %349
41: ; preds = %30
%42 = load i32*, i32** %19
%43 = load i32, i32* @SEEK_END
%44 = call i32 @fseek(i32* %42, i32 0, i32 %43)
%45 = load i32*, i32** %19
%46 = call i64 @ftell(i32* %45)
store i64 %46, i64* %13
%47 = load i32*, i32** %19
%48 = load i32, i32* @SEEK_SET
%49 = call i32 @fseek(i32* %47, i32 0, i32 %48)
%50 = load i64, i64* %13
%51 = icmp ne i64 %50, 0
br i1 %51, label %55, label %52
52: ; preds = %41
%53 = load i8*, i8** %15
%54 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i64 0, i64 0), i8* %53)
store i32 1, i32* %6
br label %349
55: ; preds = %41
%56 = load i64, i64* %13
%57 = mul i64 1, %56
%58 = add i64 %57, 1
%59 = trunc i64 %58 to i32
%60 = call i8* @malloc(i32 %59)
store i8* %60, i8** %16
%61 = load i64, i64* %13
%62 = mul i64 1, %61
%63 = add i64 %62, 1
%64 = trunc i64 %63 to i32
%65 = call i8* @malloc(i32 %64)
store i8* %65, i8** %18
%66 = load i8*, i8** %16
%67 = icmp ne i8* %66, null
br i1 %67, label %68, label %71
68: ; preds = %55
%69 = load i8*, i8** %18
%70 = icmp ne i8* %69, null
br i1 %70, label %73, label %71
71: ; preds = %68, %55
%72 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.7, i64 0, i64 0))
store i32 1, i32* %6
br label %349
73: ; preds = %68
%74 = load i8*, i8** %16
%75 = load i64, i64* %13
%76 = load i32*, i32** %19
%77 = call i64 @fread(i8* %74, i32 1, i64 %75, i32* %76)
%78 = load i64, i64* %13
%79 = icmp ne i64 %77, %78
br i1 %79, label %80, label %83
80: ; preds = %73
%81 = load i8*, i8** %15
%82 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.8, i64 0, i64 0), i8* %81)
store i32 1, i32* %6
br label %349
83: ; preds = %73
store i32 0, i32* %9
store i32 26, i32* %10
store i32 0, i32* %8
br label %84
84: ; preds = %131, %83
%85 = load i32, i32* %9
%86 = load i32, i32* %10
%87 = icmp slt i32 %85, %86
br i1 %87, label %88, label %134
88: ; preds = %84
store i32 0, i32* %11
%89 = load i64, i64* %13
%90 = trunc i64 %89 to i32
store i32 %90, i32* %12
br label %91
91: ; preds = %127, %88
%92 = load i32, i32* %11
%93 = load i32, i32* %12
%94 = icmp slt i32 %92, %93
br i1 %94, label %95, label %130
95: ; preds = %91
%96 = load i8*, i8** %16
%97 = load i32, i32* %11
%98 = sext i32 %97 to i64
%99 = getelementptr inbounds i8, i8* %96, i64 %98
%100 = load i8, i8* %99
%101 = sext i8 %100 to i32
%102 = load i32, i32* %9
%103 = add nsw i32 65, %102
%104 = icmp eq i32 %101, %103
br i1 %104, label %115, label %105
105: ; preds = %95
%106 = load i8*, i8** %16
%107 = load i32, i32* %11
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds i8, i8* %106, i64 %108
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = load i32, i32* %9
%113 = add nsw i32 97, %112
%114 = icmp eq i32 %111, %113
br i1 %114, label %115, label %126
115: ; preds = %105, %95
%116 = load i8*, i8** %16
%117 = load i32, i32* %11
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds i8, i8* %116, i64 %118
%120 = load i8, i8* %119
%121 = load i8*, i8** %18
%122 = load i32, i32* %8
%123 = add nsw i32 %122, 1
store i32 %123, i32* %8
%124 = sext i32 %122 to i64
%125 = getelementptr inbounds i8, i8* %121, i64 %124
store i8 %120, i8* %125
br label %126
126: ; preds = %115, %105
br label %127
127: ; preds = %126
%128 = load i32, i32* %11
%129 = add nsw i32 %128, 1
store i32 %129, i32* %11
br label %91
130: ; preds = %91
br label %131
131: ; preds = %130
%132 = load i32, i32* %9
%133 = add nsw i32 %132, 1
store i32 %133, i32* %9
br label %84
134: ; preds = %84
store i32 0, i32* %9
%135 = load i64, i64* %13
%136 = trunc i64 %135 to i32
store i32 %136, i32* %12
store i32 0, i32* %8
br label %137
137: ; preds = %185, %134
%138 = load i32, i32* %9
%139 = load i32, i32* %12
%140 = icmp slt i32 %138, %139
br i1 %140, label %141, label %188
141: ; preds = %137
%142 = load i8*, i8** %16
%143 = load i32, i32* %9
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8, i8* %142, i64 %144
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp sge i32 %147, 65
br i1 %148, label %149, label %157
149: ; preds = %141
%150 = load i8*, i8** %16
%151 = load i32, i32* %9
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds i8, i8* %150, i64 %152
%154 = load i8, i8* %153
%155 = sext i8 %154 to i32
%156 = icmp sle i32 %155, 90
br i1 %156, label %173, label %157
157: ; preds = %149, %141
%158 = load i8*, i8** %16
%159 = load i32, i32* %9
%160 = sext i32 %159 to i64
%161 = getelementptr inbounds i8, i8* %158, i64 %160
%162 = load i8, i8* %161
%163 = sext i8 %162 to i32
%164 = icmp sge i32 %163, 97
br i1 %164, label %165, label %184
165: ; preds = %157
%166 = load i8*, i8** %16
%167 = load i32, i32* %9
%168 = sext i32 %167 to i64
%169 = getelementptr inbounds i8, i8* %166, i64 %168
%170 = load i8, i8* %169
%171 = sext i8 %170 to i32
%172 = icmp sle i32 %171, 122
br i1 %172, label %173, label %184
173: ; preds = %165, %149
%174 = load i8*, i8** %18
%175 = load i32, i32* %8
%176 = add nsw i32 %175, 1
store i32 %176, i32* %8
%177 = sext i32 %175 to i64
%178 = getelementptr inbounds i8, i8* %174, i64 %177
%179 = load i8, i8* %178
%180 = load i8*, i8** %16
%181 = load i32, i32* %9
%182 = sext i32 %181 to i64
%183 = getelementptr inbounds i8, i8* %180, i64 %182
store i8 %179, i8* %183
br label %184
184: ; preds = %173, %165, %157
br label %185
185: ; preds = %184
%186 = load i32, i32* %9
%187 = add nsw i32 %186, 1
store i32 %187, i32* %9
br label %137
188: ; preds = %137
%189 = load i8*, i8** %15
%190 = call i64 @strlen(i8* %189)
store i64 %190, i64* %14
%191 = load i64, i64* %14
%192 = mul i64 1, %191
%193 = add i64 %192, 1
%194 = trunc i64 %193 to i32
%195 = call i8* @malloc(i32 %194)
store i8* %195, i8** %17
%196 = load i8*, i8** %17
%197 = icmp ne i8* %196, null
br i1 %197, label %200, label %198
198: ; preds = %188
%199 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.7, i64 0, i64 0))
store i32 1, i32* %6
br label %349
200: ; preds = %188
%201 = load i64, i64* %14
%202 = sub i64 %201, 1
%203 = trunc i64 %202 to i32
store i32 %203, i32* %9
store i32 0, i32* %12
br label %204
204: ; preds = %220, %200
%205 = load i32, i32* %9
%206 = load i32, i32* %12
%207 = icmp sge i32 %205, %206
br i1 %207, label %208, label %223
208: ; preds = %204
%209 = load i8*, i8** %15
%210 = load i32, i32* %9
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds i8, i8* %209, i64 %211
%213 = load i8, i8* %212
%214 = sext i8 %213 to i32
%215 = icmp eq i32 %214, 47
br i1 %215, label %216, label %219
216: ; preds = %208
%217 = load i32, i32* %9
store i32 %217, i32* %7
%218 = load i32, i32* %12
store i32 %218, i32* %9
br label %219
219: ; preds = %216, %208
br label %220
220: ; preds = %219
%221 = load i32, i32* %9
%222 = add nsw i32 %221, -1
store i32 %222, i32* %9
br label %204
223: ; preds = %204
store i32 0, i32* %9
store i32 26, i32* %10
store i32 0, i32* %8
br label %224
224: ; preds = %272, %223
%225 = load i32, i32* %9
%226 = load i32, i32* %10
%227 = icmp slt i32 %225, %226
br i1 %227, label %228, label %275
228: ; preds = %224
%229 = load i32, i32* %7
store i32 %229, i32* %11
%230 = load i64, i64* %14
%231 = trunc i64 %230 to i32
store i32 %231, i32* %12
br label %232
232: ; preds = %268, %228
%233 = load i32, i32* %11
%234 = load i32, i32* %12
%235 = icmp slt i32 %233, %234
br i1 %235, label %236, label %271
236: ; preds = %232
%237 = load i8*, i8** %15
%238 = load i32, i32* %11
%239 = sext i32 %238 to i64
%240 = getelementptr inbounds i8, i8* %237, i64 %239
%241 = load i8, i8* %240
%242 = sext i8 %241 to i32
%243 = load i32, i32* %9
%244 = add nsw i32 65, %243
%245 = icmp eq i32 %242, %244
br i1 %245, label %256, label %246
246: ; preds = %236
%247 = load i8*, i8** %15
%248 = load i32, i32* %11
%249 = sext i32 %248 to i64
%250 = getelementptr inbounds i8, i8* %247, i64 %249
%251 = load i8, i8* %250
%252 = sext i8 %251 to i32
%253 = load i32, i32* %9
%254 = add nsw i32 97, %253
%255 = icmp eq i32 %252, %254
br i1 %255, label %256, label %267
256: ; preds = %246, %236
%257 = load i8*, i8** %15
%258 = load i32, i32* %11
%259 = sext i32 %258 to i64
%260 = getelementptr inbounds i8, i8* %257, i64 %259
%261 = load i8, i8* %260
%262 = load i8*, i8** %17
%263 = load i32, i32* %8
%264 = add nsw i32 %263, 1
store i32 %264, i32* %8
%265 = sext i32 %263 to i64
%266 = getelementptr inbounds i8, i8* %262, i64 %265
store i8 %261, i8* %266
br label %267
267: ; preds = %256, %246
br label %268
268: ; preds = %267
%269 = load i32, i32* %11
%270 = add nsw i32 %269, 1
store i32 %270, i32* %11
br label %232
271: ; preds = %232
br label %272
272: ; preds = %271
%273 = load i32, i32* %9
%274 = add nsw i32 %273, 1
store i32 %274, i32* %9
br label %224
275: ; preds = %224
%276 = load i32, i32* %7
store i32 %276, i32* %9
%277 = load i64, i64* %14
%278 = trunc i64 %277 to i32
store i32 %278, i32* %12
store i32 0, i32* %8
br label %279
279: ; preds = %327, %275
%280 = load i32, i32* %9
%281 = load i32, i32* %12
%282 = icmp slt i32 %280, %281
br i1 %282, label %283, label %330
283: ; preds = %279
%284 = load i8*, i8** %15
%285 = load i32, i32* %9
%286 = sext i32 %285 to i64
%287 = getelementptr inbounds i8, i8* %284, i64 %286
%288 = load i8, i8* %287
%289 = sext i8 %288 to i32
%290 = icmp sge i32 %289, 65
br i1 %290, label %291, label %299
291: ; preds = %283
%292 = load i8*, i8** %15
%293 = load i32, i32* %9
%294 = sext i32 %293 to i64
%295 = getelementptr inbounds i8, i8* %292, i64 %294
%296 = load i8, i8* %295
%297 = sext i8 %296 to i32
%298 = icmp sle i32 %297, 90
br i1 %298, label %315, label %299
299: ; preds = %291, %283
%300 = load i8*, i8** %15
%301 = load i32, i32* %9
%302 = sext i32 %301 to i64
%303 = getelementptr inbounds i8, i8* %300, i64 %302
%304 = load i8, i8* %303
%305 = sext i8 %304 to i32
%306 = icmp sge i32 %305, 97
br i1 %306, label %307, label %326
307: ; preds = %299
%308 = load i8*, i8** %15
%309 = load i32, i32* %9
%310 = sext i32 %309 to i64
%311 = getelementptr inbounds i8, i8* %308, i64 %310
%312 = load i8, i8* %311
%313 = sext i8 %312 to i32
%314 = icmp sle i32 %313, 122
br i1 %314, label %315, label %326
315: ; preds = %307, %291
%316 = load i8*, i8** %17
%317 = load i32, i32* %8
%318 = add nsw i32 %317, 1
store i32 %318, i32* %8
%319 = sext i32 %317 to i64
%320 = getelementptr inbounds i8, i8* %316, i64 %319
%321 = load i8, i8* %320
%322 = load i8*, i8** %15
%323 = load i32, i32* %9
%324 = sext i32 %323 to i64
%325 = getelementptr inbounds i8, i8* %322, i64 %324
store i8 %321, i8* %325
br label %326
326: ; preds = %315, %307, %299
br label %327
327: ; preds = %326
%328 = load i32, i32* %9
%329 = add nsw i32 %328, 1
store i32 %329, i32* %9
br label %279
330: ; preds = %279
%331 = load i8*, i8** %15
%332 = call i32* @fopen(i8* %331, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
store i32* %332, i32** %20
%333 = load i32*, i32** %20
%334 = icmp ne i32* %333, null
br i1 %334, label %338, label %335
335: ; preds = %330
%336 = load i8*, i8** %15
%337 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.5, i64 0, i64 0), i8* %336)
store i32 1, i32* %6
br label %349
338: ; preds = %330
%339 = load i8*, i8** %16
%340 = load i64, i64* %13
%341 = load i32*, i32** %20
%342 = call i64 @fwrite(i8* %339, i32 1, i64 %340, i32* %341)
%343 = load i64, i64* %13
%344 = icmp ne i64 %342, %343
br i1 %344, label %345, label %348
345: ; preds = %338
%346 = load i8*, i8** %15
%347 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str.10, i64 0, i64 0), i8* %346)
store i32 1, i32* %6
br label %349
348: ; preds = %338
br label %349
349: ; preds = %348, %345, %335, %198, %80, %71, %52, %38, %23
%350 = load i32*, i32** %19
%351 = icmp ne i32* %350, null
br i1 %351, label %352, label %355
352: ; preds = %349
%353 = load i32*, i32** %19
%354 = call i32 @fclose(i32* %353)
br label %355
355: ; preds = %352, %349
%356 = load i32*, i32** %20
%357 = icmp ne i32* %356, null
br i1 %357, label %358, label %361
358: ; preds = %355
%359 = load i32*, i32** %20
%360 = call i32 @fclose(i32* %359)
br label %361
361: ; preds = %358, %355
%362 = load i8*, i8** %16
%363 = icmp ne i8* %362, null
br i1 %363, label %364, label %367
364: ; preds = %361
%365 = load i8*, i8** %16
%366 = call i32 @free(i8* %365)
br label %367
367: ; preds = %364, %361
%368 = load i8*, i8** %18
%369 = icmp ne i8* %368, null
br i1 %369, label %370, label %373
370: ; preds = %367
%371 = load i8*, i8** %18
%372 = call i32 @free(i8* %371)
br label %373
373: ; preds = %370, %367
%374 = load i8*, i8** %17
%375 = icmp ne i8* %374, null
br i1 %375, label %376, label %379
376: ; preds = %373
%377 = load i8*, i8** %17
%378 = call i32 @free(i8* %377)
br label %379
379: ; preds = %376, %373
%380 = load i32, i32* %6
ret i32 %380
}

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