#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int comprez(char *, char *, char *, int, int);
int decomprez(char *, char *, int);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *);
int /*<<< orphan*/ free(char *);
scalar_t__ malloc(int);
int /*<<< orphan*/ printf(char *, ...);
int recover(char *, char *);
int /*<<< orphan*/ stderr;
scalar_t__ strcmp(char *, char *);
int main(int argc, char *argv[]) {
  int returnValue = 0, counter = 0, verbosity = 0;
  int mode = 0, algo = 0;
  char *fileName = NULL, *filePath = NULL;
  char *fileToCompress = NULL, *compressedFileName = NULL,
       *decomprezFileName = NULL;
  if (argc == 1) {
    fprintf(stderr, "not a valid syntax");
    return -1;
  }
  for (counter = 1; counter < argc; counter++) {
    if (strcmp(argv[counter], "-v") == 0) {
      verbosity = 1;
    } else if (strcmp(argv[counter], "-p") == 0) {
      filePath = argv[++counter];
      if (verbosity != 0) {
        printf("FilePath: %s \n", filePath);
      }
    } else if (strcmp(argv[counter], "-i") == 0 ||
               strcmp(argv[counter], "--image") == 0) {
      fileName = argv[++counter];
      if (verbosity != 0) {
        printf("Image fileName: %s \n", fileName);
      }
    } else if (strcmp(argv[counter], "-c") == 0) {
      fileToCompress = argv[++counter];
      if (verbosity != 0)
        printf("FileToCompress: %s \n", fileToCompress);
    } else if (strcmp(argv[counter], "-f") == 0 ||
               strcmp(argv[counter], "--file") == 0) {
      compressedFileName = argv[++counter];
      if (verbosity != 0) {
        printf("Compressed file name: %s \n", compressedFileName);
      }
    } else if (strcmp(argv[counter], "-d") == 0 ||
               strcmp(argv[counter], "--decomprez") == 0) {
      decomprezFileName = argv[++counter];
      if (verbosity != 0) {
        printf("File to be decomprez: %s \n", decomprezFileName);
      }
    } else if (strcmp(argv[counter], "-a") == 0 ||
               strcmp(argv[counter], "--algo") == 0) {
      counter++;
      if (strcmp(argv[counter], "lb") == 0 ||
          strcmp(argv[counter], "leastbit") == 0) {
        algo = 0;
        if (verbosity != 0) {
          printf("Algorithm used: least Bit \n");
        }
      } else if (strcmp(argv[counter], "p") == 0 ||
                 strcmp(argv[counter], "prob") == 0) {
        algo = 1;
        if (verbosity != 0) {
          printf("Algorithm used: probability \n");
        }
      } else {
        fprintf(stderr, "syntax error expected lb or leastbit or p or prob "
                        "after -a or --algo\n");
      }
    } else if (strcmp(argv[counter], "-m") == 0 ||
               strcmp(argv[counter], "--mode") == 0) {
      counter++;
      if (strcmp(argv[counter], "w") == 0 ||
          strcmp(argv[counter], "word") == 0) {
        mode = 1;
        if (verbosity != 0) {
          printf("Compressing by using word analysis \n");
        }
      } else if (strcmp(argv[counter], "a") == 0 ||
                 strcmp(argv[counter], "ascii") == 0) {
        mode = 0;
        if (verbosity != 0) {
          printf("Compression by using ascii character analysis \n");
        }
      } else {
        fprintf(stderr, "syntax error expected W or WORD or A or ASCII after "
                        "-M or --MODE\n");
      }
    }
  }
  if (fileName != NULL) {
    if (filePath != NULL)
      returnValue = recover(fileName, filePath);
    else {
      filePath = (char *)malloc(sizeof(char) * 5);
      filePath = "./";
      returnValue = recover(fileName, filePath);
      free(filePath);
    }
  } else if (fileToCompress != NULL) {
    returnValue = comprez(fileToCompress, compressedFileName,
                          compressedFileName, mode, algo);
  } else if (decomprezFileName != NULL) {
    returnValue = decomprez(decomprezFileName, decomprezFileName, mode);
  } else {
    returnValue = -1;
  }
  return returnValue;
}


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   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movq   $0x0,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
movq   $0x0,-0x40(%rbp)
movq   $0x0,-0x48(%rbp)
movq   $0x0,-0x50(%rbp)
cmpl   $0x1,-0x8(%rbp)
jne    120c <main+0x8c>
mov    0x2dee(%rip),%rax
mov    (%rax),%edi
lea    0xe05(%rip),%rsi
call   1060 <fprintf@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    17ef <main+0x66f>
movl   $0x1,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1728 <main+0x5a8>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xde1(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    124d <main+0xcd>
movl   $0x1,-0x1c(%rbp)
jmp    1715 <main+0x595>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xdb6(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    12a8 <main+0x128>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x38(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     12a3 <main+0x123>
mov    -0x38(%rbp),%rsi
lea    0xd7d(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1710 <main+0x590>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xd6d(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     12ec <main+0x16c>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xd4e(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    1325 <main+0x1a5>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x30(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1320 <main+0x1a0>
mov    -0x30(%rbp),%rsi
lea    0xd1a(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    170b <main+0x58b>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xd10(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    1380 <main+0x200>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x40(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     137b <main+0x1fb>
mov    -0x40(%rbp),%rsi
lea    0xcd7(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1706 <main+0x586>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xccd(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     13c4 <main+0x244>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xcae(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    13fd <main+0x27d>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x48(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     13f8 <main+0x278>
mov    -0x48(%rbp),%rsi
lea    0xc79(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    1701 <main+0x581>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xc75(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     1441 <main+0x2c1>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xc56(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    147a <main+0x2fa>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x18(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x50(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1475 <main+0x2f5>
mov    -0x50(%rbp),%rsi
lea    0xc26(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    16fc <main+0x57c>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xc22(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     14be <main+0x33e>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xc03(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    15b6 <main+0x436>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xbdf(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     150b <main+0x38b>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xbc0(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    152f <main+0x3af>
movl   $0x0,-0x24(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     152a <main+0x3aa>
lea    0xba2(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    15b1 <main+0x431>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xad5(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     1573 <main+0x3f3>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xb7d(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    1597 <main+0x417>
movl   $0x1,-0x24(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1592 <main+0x412>
lea    0xb5b(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    15ac <main+0x42c>
mov    0x2a42(%rip),%rax
mov    (%rax),%edi
lea    0xb5d(%rip),%rsi
call   1060 <fprintf@plt>
jmp    15b1 <main+0x431>
jmp    16f7 <main+0x577>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xb81(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     15fa <main+0x47a>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xb62(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    16f2 <main+0x572>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xb3e(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     1647 <main+0x4c7>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xb1e(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    166b <main+0x4eb>
movl   $0x1,-0x20(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1666 <main+0x4e6>
lea    0xafc(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    16ed <main+0x56d>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xa32(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
je     16af <main+0x52f>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xae0(%rip),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    16d3 <main+0x553>
movl   $0x0,-0x20(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     16ce <main+0x54e>
lea    0xabf(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    16e8 <main+0x568>
mov    0x2906(%rip),%rax
mov    (%rax),%edi
lea    0xad3(%rip),%rsi
call   1060 <fprintf@plt>
jmp    16ed <main+0x56d>
jmp    16f2 <main+0x572>
jmp    16f7 <main+0x577>
jmp    16fc <main+0x57c>
jmp    1701 <main+0x581>
jmp    1706 <main+0x586>
jmp    170b <main+0x58b>
jmp    1710 <main+0x590>
jmp    1715 <main+0x595>
jmp    171a <main+0x59a>
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1213 <main+0x93>
cmpq   $0x0,-0x30(%rbp)
je     178a <main+0x60a>
cmpq   $0x0,-0x38(%rbp)
je     1753 <main+0x5d3>
mov    -0x30(%rbp),%rdi
mov    -0x38(%rbp),%rsi
call   1090 <recover@plt>
mov    %eax,-0x14(%rbp)
jmp    1785 <main+0x605>
mov    $0x5,%edi
call   1070 <malloc@plt>
mov    %rax,-0x38(%rbp)
lea    0xa90(%rip),%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rdi
mov    -0x38(%rbp),%rsi
call   1090 <recover@plt>
mov    %eax,-0x14(%rbp)
mov    -0x38(%rbp),%rdi
call   1030 <free@plt>
jmp    17e9 <main+0x669>
cmpq   $0x0,-0x40(%rbp)
je     17b5 <main+0x635>
mov    -0x40(%rbp),%rdi
mov    -0x48(%rbp),%rsi
mov    -0x48(%rbp),%rdx
mov    -0x20(%rbp),%ecx
mov    -0x24(%rbp),%r8d
call   10a0 <comprez@plt>
mov    %eax,-0x14(%rbp)
jmp    17e4 <main+0x664>
cmpq   $0x0,-0x50(%rbp)
je     17d8 <main+0x658>
mov    -0x50(%rbp),%rdi
mov    -0x50(%rbp),%rsi
mov    -0x20(%rbp),%edx
call   1080 <decomprez@plt>
mov    %eax,-0x14(%rbp)
jmp    17df <main+0x65f>
movl   $0xffffffff,-0x14(%rbp)
jmp    17e4 <main+0x664>
jmp    17e9 <main+0x669>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
cmp    $0x1,%edi
jne    11bd <main+0x2d>
mov    0x2e36(%rip),%rax
mov    (%rax),%edi
lea    0xe4d(%rip),%rsi
call   1070 <fprintf@plt>
jmp    165e <main+0x4ce>
jle    165e <main+0x4ce>
mov    %rsi,%rbx
mov    %edi,%ebp
mov    $0x1,%r15d
lea    0xe3e(%rip),%r14
xor    %eax,%eax
mov    %rax,0x10(%rsp)
xor    %eax,%eax
mov    %rax,0x18(%rsp)
xor    %eax,%eax
mov    %rax,0x20(%rsp)
xor    %eax,%eax
mov    %rax,0x28(%rsp)
xor    %eax,%eax
mov    %rax,0x30(%rsp)
movl   $0x0,0xc(%rsp)
movl   $0x0,0x8(%rsp)
xor    %r13d,%r13d
jmp    1249 <main+0xb9>
nopl   (%rax)
lea    0x1(%r12),%r15d
mov    0x8(%rbx,%r12,8),%rsi
test   %r13d,%r13d
mov    %rsi,0x30(%rsp)
je     15b0 <main+0x420>
lea    0xe04(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
mov    $0x1,%r13d
add    $0x1,%r15d
cmp    %ebp,%r15d
jge    15b8 <main+0x428>
movslq %r15d,%r12
mov    (%rbx,%r12,8),%rdi
mov    %r14,%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1236 <main+0xa6>
mov    (%rbx,%r12,8),%rdi
lea    0xdae(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1410 <main+0x280>
mov    (%rbx,%r12,8),%rdi
lea    0xda7(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1210 <main+0x80>
mov    (%rbx,%r12,8),%rdi
lea    0xd95(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1210 <main+0x80>
mov    (%rbx,%r12,8),%rdi
lea    0xd99(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1458 <main+0x2c8>
mov    (%rbx,%r12,8),%rdi
lea    0xd98(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1434 <main+0x2a4>
mov    (%rbx,%r12,8),%rdi
lea    0xd82(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1434 <main+0x2a4>
mov    (%rbx,%r12,8),%rdi
lea    0xd8b(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     147c <main+0x2ec>
mov    (%rbx,%r12,8),%rdi
lea    0xd75(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     147c <main+0x2ec>
mov    (%rbx,%r12,8),%rdi
lea    0xd83(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     14a0 <main+0x310>
mov    (%rbx,%r12,8),%rdi
lea    0xd6d(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     14a0 <main+0x310>
mov    (%rbx,%r12,8),%rdi
lea    0xdb2(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1381 <main+0x1f1>
mov    (%rbx,%r12,8),%rdi
lea    0xda0(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
jne    123c <main+0xac>
lea    0x1(%r12),%r15d
mov    0x8(%rbx,%r12,8),%rdi
lea    0xd88(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     153a <main+0x3aa>
add    $0x1,%r12
mov    (%rbx,%r12,8),%rdi
lea    0xd6d(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     153a <main+0x3aa>
mov    (%rbx,%r12,8),%rdi
lea    0xce8(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1582 <main+0x3f2>
mov    (%rbx,%r12,8),%rdi
lea    0xd40(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1582 <main+0x3f2>
mov    0x2bea(%rip),%rax
mov    (%rax),%edi
lea    0xd28(%rip),%rsi
jmp    150e <main+0x37e>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
lea    0x1(%r12),%r15d
mov    0x8(%rbx,%r12,8),%rsi
test   %r13d,%r13d
mov    %rsi,0x28(%rsp)
je     15b0 <main+0x420>
lea    0xbea(%rip),%rdi
jmp    122f <main+0x9f>
lea    0x1(%r12),%r15d
mov    0x8(%rbx,%r12,8),%rsi
test   %r13d,%r13d
mov    %rsi,0x18(%rsp)
je     15b0 <main+0x420>
lea    0xc17(%rip),%rdi
jmp    122f <main+0x9f>
lea    0x1(%r12),%r15d
mov    0x8(%rbx,%r12,8),%rsi
test   %r13d,%r13d
mov    %rsi,0x20(%rsp)
je     15b0 <main+0x420>
lea    0xbd4(%rip),%rdi
jmp    122f <main+0x9f>
lea    0x1(%r12),%r15d
mov    0x8(%rbx,%r12,8),%rsi
test   %r13d,%r13d
mov    %rsi,0x10(%rsp)
je     15b0 <main+0x420>
lea    0xbf9(%rip),%rdi
jmp    122f <main+0x9f>
lea    0x1(%r12),%r15d
mov    0x8(%rbx,%r12,8),%rdi
lea    0xc08(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1518 <main+0x388>
add    $0x1,%r12
mov    (%rbx,%r12,8),%rdi
lea    0xbf2(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1518 <main+0x388>
mov    (%rbx,%r12,8),%rdi
lea    0xb38(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     155e <main+0x3ce>
mov    (%rbx,%r12,8),%rdi
lea    0xbd1(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     155e <main+0x3ce>
mov    0x2adb(%rip),%rax
mov    (%rax),%edi
lea    0xbbc(%rip),%rsi
call   1070 <fprintf@plt>
jmp    123c <main+0xac>
movl   $0x0,0xc(%rsp)
test   %r13d,%r13d
je     15b0 <main+0x420>
lea    0xcac(%rip),%rdi
call   1040 <puts@plt>
jmp    1236 <main+0xa6>
test   %r13d,%r13d
je     1598 <main+0x408>
lea    0xc55(%rip),%rdi
call   1040 <puts@plt>
mov    $0x1,%r13d
movl   $0x1,0x8(%rsp)
jmp    123c <main+0xac>
test   %r13d,%r13d
je     15a8 <main+0x418>
lea    0xc55(%rip),%rdi
call   1040 <puts@plt>
mov    $0x1,%r13d
movl   $0x1,0xc(%rsp)
jmp    123c <main+0xac>
movl   $0x0,0x8(%rsp)
test   %r13d,%r13d
je     15b0 <main+0x420>
lea    0xbd6(%rip),%rdi
jmp    1530 <main+0x3a0>
movl   $0x1,0x8(%rsp)
xor    %r13d,%r13d
jmp    123c <main+0xac>
movl   $0x1,0xc(%rsp)
xor    %r13d,%r13d
jmp    123c <main+0xac>
mov    0x30(%rsp),%rbp
test   %rbp,%rbp
je     15e2 <main+0x452>
mov    0x28(%rsp),%rsi
test   %rsi,%rsi
je     1610 <main+0x480>
mov    %rbp,%rdi
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    10a0 <recover@plt>
mov    0x20(%rsp),%rdi
test   %rdi,%rdi
je     163a <main+0x4aa>
mov    0x18(%rsp),%rdx
mov    %rdx,%rsi
mov    0x8(%rsp),%ecx
mov    0xc(%rsp),%r8d
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    10b0 <comprez@plt>
mov    $0x5,%edi
call   1080 <malloc@plt>
lea    0xb48(%rip),%rbx
mov    %rbp,%rdi
mov    %rbx,%rsi
call   10a0 <recover@plt>
mov    %eax,%ebp
mov    %rbx,%rdi
call   1030 <free@plt>
mov    %ebp,%eax
jmp    1663 <main+0x4d3>
mov    0x10(%rsp),%rdi
test   %rdi,%rdi
je     165e <main+0x4ce>
mov    %rdi,%rsi
mov    0x8(%rsp),%edx
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1090 <decomprez@plt>
mov    $0xffffffff,%eax
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@stderr = global i32 0
@.str = [19 x i8] c"not a valid syntax\00"
@.str.1 = [3 x i8] c"-v\00"
@.str.2 = [3 x i8] c"-p\00"
@.str.3 = [15 x i8] c"FilePath: %s \0A\00"
@.str.4 = [3 x i8] c"-i\00"
@.str.5 = [8 x i8] c"--image\00"
@.str.6 = [21 x i8] c"Image fileName: %s \0A\00"
@.str.7 = [3 x i8] c"-c\00"
@.str.8 = [21 x i8] c"FileToCompress: %s \0A\00"
@.str.9 = [3 x i8] c"-f\00"
@.str.10 = [7 x i8] c"--file\00"
@.str.11 = [27 x i8] c"Compressed file name: %s \0A\00"
@.str.12 = [3 x i8] c"-d\00"
@.str.13 = [12 x i8] c"--decomprez\00"
@.str.14 = [27 x i8] c"File to be decomprez: %s \0A\00"
@.str.15 = [3 x i8] c"-a\00"
@.str.16 = [7 x i8] c"--algo\00"
@.str.17 = [3 x i8] c"lb\00"
@.str.18 = [9 x i8] c"leastbit\00"
@.str.19 = [28 x i8] c"Algorithm used: least Bit \0A\00"
@.str.20 = [2 x i8] c"p\00"
@.str.21 = [5 x i8] c"prob\00"
@.str.22 = [30 x i8] c"Algorithm used: probability \0A\00"
@.str.23 = [70 x i8] c"syntax error expected lb or leastbit or p or prob after -a or --algo\0A\00"
@.str.24 = [3 x i8] c"-m\00"
@.str.25 = [7 x i8] c"--mode\00"
@.str.26 = [2 x i8] c"w\00"
@.str.27 = [5 x i8] c"word\00"
@.str.28 = [37 x i8] c"Compressing by using word analysis \0A\00"
@.str.29 = [2 x i8] c"a\00"
@.str.30 = [6 x i8] c"ascii\00"
@.str.31 = [48 x i8] c"Compression by using ascii character analysis \0A\00"
@.str.32 = [66 x i8] c"syntax error expected W or WORD or A or ASCII after -M or --MODE\0A\00"
@.str.33 = [3 x i8] c"./\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 i8*
%12 = alloca i8*
%13 = alloca i8*
%14 = alloca i8*
%15 = alloca i8*
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 i8* null, i8** %11
store i8* null, i8** %12
store i8* null, i8** %13
store i8* null, i8** %14
store i8* null, i8** %15
%16 = load i32, i32* %4
%17 = icmp eq i32 %16, 1
br i1 %17, label %18, label %21
18: ; preds = %2
%19 = load i32, i32* @stderr
%20 = call i32 @fprintf(i32 %19, i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i64 0, i64 0))
store i32 -1, i32* %3
br label %351
21: ; preds = %2
store i32 1, i32* %7
br label %22
22: ; preds = %306, %21
%23 = load i32, i32* %7
%24 = load i32, i32* %4
%25 = icmp slt i32 %23, %24
br i1 %25, label %26, label %309
26: ; preds = %22
%27 = load i8**, i8*** %5
%28 = load i32, i32* %7
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8*, i8** %27, i64 %29
%31 = load i8*, i8** %30
%32 = call i64 @strcmp(i8* %31, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i64 0, i64 0))
%33 = icmp eq i64 %32, 0
br i1 %33, label %34, label %35
34: ; preds = %26
store i32 1, i32* %8
br label %305
35: ; preds = %26
%36 = load i8**, i8*** %5
%37 = load i32, i32* %7
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds i8*, i8** %36, i64 %38
%40 = load i8*, i8** %39
%41 = call i64 @strcmp(i8* %40, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0))
%42 = icmp eq i64 %41, 0
br i1 %42, label %43, label %56
43: ; preds = %35
%44 = load i8**, i8*** %5
%45 = load i32, i32* %7
%46 = add nsw i32 %45, 1
store i32 %46, i32* %7
%47 = sext i32 %46 to i64
%48 = getelementptr inbounds i8*, i8** %44, i64 %47
%49 = load i8*, i8** %48
store i8* %49, i8** %12
%50 = load i32, i32* %8
%51 = icmp ne i32 %50, 0
br i1 %51, label %52, label %55
52: ; preds = %43
%53 = load i8*, i8** %12
%54 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0), i8* %53)
br label %55
55: ; preds = %52, %43
br label %304
56: ; preds = %35
%57 = load i8**, i8*** %5
%58 = load i32, i32* %7
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8*, i8** %57, i64 %59
%61 = load i8*, i8** %60
%62 = call i64 @strcmp(i8* %61, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i64 0, i64 0))
%63 = icmp eq i64 %62, 0
br i1 %63, label %72, label %64
64: ; preds = %56
%65 = load i8**, i8*** %5
%66 = load i32, i32* %7
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i8*, i8** %65, i64 %67
%69 = load i8*, i8** %68
%70 = call i64 @strcmp(i8* %69, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i64 0, i64 0))
%71 = icmp eq i64 %70, 0
br i1 %71, label %72, label %85
72: ; preds = %64, %56
%73 = load i8**, i8*** %5
%74 = load i32, i32* %7
%75 = add nsw i32 %74, 1
store i32 %75, i32* %7
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds i8*, i8** %73, i64 %76
%78 = load i8*, i8** %77
store i8* %78, i8** %11
%79 = load i32, i32* %8
%80 = icmp ne i32 %79, 0
br i1 %80, label %81, label %84
81: ; preds = %72
%82 = load i8*, i8** %11
%83 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.6, i64 0, i64 0), i8* %82)
br label %84
84: ; preds = %81, %72
br label %303
85: ; preds = %64
%86 = load i8**, i8*** %5
%87 = load i32, i32* %7
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i8*, i8** %86, i64 %88
%90 = load i8*, i8** %89
%91 = call i64 @strcmp(i8* %90, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.7, i64 0, i64 0))
%92 = icmp eq i64 %91, 0
br i1 %92, label %93, label %106
93: ; preds = %85
%94 = load i8**, i8*** %5
%95 = load i32, i32* %7
%96 = add nsw i32 %95, 1
store i32 %96, i32* %7
%97 = sext i32 %96 to i64
%98 = getelementptr inbounds i8*, i8** %94, i64 %97
%99 = load i8*, i8** %98
store i8* %99, i8** %13
%100 = load i32, i32* %8
%101 = icmp ne i32 %100, 0
br i1 %101, label %102, label %105
102: ; preds = %93
%103 = load i8*, i8** %13
%104 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.8, i64 0, i64 0), i8* %103)
br label %105
105: ; preds = %102, %93
br label %302
106: ; preds = %85
%107 = load i8**, i8*** %5
%108 = load i32, i32* %7
%109 = sext i32 %108 to i64
%110 = getelementptr inbounds i8*, i8** %107, i64 %109
%111 = load i8*, i8** %110
%112 = call i64 @strcmp(i8* %111, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%113 = icmp eq i64 %112, 0
br i1 %113, label %122, label %114
114: ; preds = %106
%115 = load i8**, i8*** %5
%116 = load i32, i32* %7
%117 = sext i32 %116 to i64
%118 = getelementptr inbounds i8*, i8** %115, i64 %117
%119 = load i8*, i8** %118
%120 = call i64 @strcmp(i8* %119, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.10, i64 0, i64 0))
%121 = icmp eq i64 %120, 0
br i1 %121, label %122, label %135
122: ; preds = %114, %106
%123 = load i8**, i8*** %5
%124 = load i32, i32* %7
%125 = add nsw i32 %124, 1
store i32 %125, i32* %7
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds i8*, i8** %123, i64 %126
%128 = load i8*, i8** %127
store i8* %128, i8** %14
%129 = load i32, i32* %8
%130 = icmp ne i32 %129, 0
br i1 %130, label %131, label %134
131: ; preds = %122
%132 = load i8*, i8** %14
%133 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.11, i64 0, i64 0), i8* %132)
br label %134
134: ; preds = %131, %122
br label %301
135: ; preds = %114
%136 = load i8**, i8*** %5
%137 = load i32, i32* %7
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds i8*, i8** %136, i64 %138
%140 = load i8*, i8** %139
%141 = call i64 @strcmp(i8* %140, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.12, i64 0, i64 0))
%142 = icmp eq i64 %141, 0
br i1 %142, label %151, label %143
143: ; preds = %135
%144 = load i8**, i8*** %5
%145 = load i32, i32* %7
%146 = sext i32 %145 to i64
%147 = getelementptr inbounds i8*, i8** %144, i64 %146
%148 = load i8*, i8** %147
%149 = call i64 @strcmp(i8* %148, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.13, i64 0, i64 0))
%150 = icmp eq i64 %149, 0
br i1 %150, label %151, label %164
151: ; preds = %143, %135
%152 = load i8**, i8*** %5
%153 = load i32, i32* %7
%154 = add nsw i32 %153, 1
store i32 %154, i32* %7
%155 = sext i32 %154 to i64
%156 = getelementptr inbounds i8*, i8** %152, i64 %155
%157 = load i8*, i8** %156
store i8* %157, i8** %15
%158 = load i32, i32* %8
%159 = icmp ne i32 %158, 0
br i1 %159, label %160, label %163
160: ; preds = %151
%161 = load i8*, i8** %15
%162 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.14, i64 0, i64 0), i8* %161)
br label %163
163: ; preds = %160, %151
br label %300
164: ; preds = %143
%165 = load i8**, i8*** %5
%166 = load i32, i32* %7
%167 = sext i32 %166 to i64
%168 = getelementptr inbounds i8*, i8** %165, i64 %167
%169 = load i8*, i8** %168
%170 = call i64 @strcmp(i8* %169, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.15, i64 0, i64 0))
%171 = icmp eq i64 %170, 0
br i1 %171, label %180, label %172
172: ; preds = %164
%173 = load i8**, i8*** %5
%174 = load i32, i32* %7
%175 = sext i32 %174 to i64
%176 = getelementptr inbounds i8*, i8** %173, i64 %175
%177 = load i8*, i8** %176
%178 = call i64 @strcmp(i8* %177, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.16, i64 0, i64 0))
%179 = icmp eq i64 %178, 0
br i1 %179, label %180, label %231
180: ; preds = %172, %164
%181 = load i32, i32* %7
%182 = add nsw i32 %181, 1
store i32 %182, i32* %7
%183 = load i8**, i8*** %5
%184 = load i32, i32* %7
%185 = sext i32 %184 to i64
%186 = getelementptr inbounds i8*, i8** %183, i64 %185
%187 = load i8*, i8** %186
%188 = call i64 @strcmp(i8* %187, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.17, i64 0, i64 0))
%189 = icmp eq i64 %188, 0
br i1 %189, label %198, label %190
190: ; preds = %180
%191 = load i8**, i8*** %5
%192 = load i32, i32* %7
%193 = sext i32 %192 to i64
%194 = getelementptr inbounds i8*, i8** %191, i64 %193
%195 = load i8*, i8** %194
%196 = call i64 @strcmp(i8* %195, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.18, i64 0, i64 0))
%197 = icmp eq i64 %196, 0
br i1 %197, label %198, label %204
198: ; preds = %190, %180
store i32 0, i32* %10
%199 = load i32, i32* %8
%200 = icmp ne i32 %199, 0
br i1 %200, label %201, label %203
201: ; preds = %198
%202 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.19, i64 0, i64 0))
br label %203
203: ; preds = %201, %198
br label %230
204: ; preds = %190
%205 = load i8**, i8*** %5
%206 = load i32, i32* %7
%207 = sext i32 %206 to i64
%208 = getelementptr inbounds i8*, i8** %205, i64 %207
%209 = load i8*, i8** %208
%210 = call i64 @strcmp(i8* %209, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.20, i64 0, i64 0))
%211 = icmp eq i64 %210, 0
br i1 %211, label %220, label %212
212: ; preds = %204
%213 = load i8**, i8*** %5
%214 = load i32, i32* %7
%215 = sext i32 %214 to i64
%216 = getelementptr inbounds i8*, i8** %213, i64 %215
%217 = load i8*, i8** %216
%218 = call i64 @strcmp(i8* %217, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.21, i64 0, i64 0))
%219 = icmp eq i64 %218, 0
br i1 %219, label %220, label %226
220: ; preds = %212, %204
store i32 1, i32* %10
%221 = load i32, i32* %8
%222 = icmp ne i32 %221, 0
br i1 %222, label %223, label %225
223: ; preds = %220
%224 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.22, i64 0, i64 0))
br label %225
225: ; preds = %223, %220
br label %229
226: ; preds = %212
%227 = load i32, i32* @stderr
%228 = call i32 @fprintf(i32 %227, i8* getelementptr inbounds ([70 x i8], [70 x i8]* @.str.23, i64 0, i64 0))
br label %229
229: ; preds = %226, %225
br label %230
230: ; preds = %229, %203
br label %299
231: ; preds = %172
%232 = load i8**, i8*** %5
%233 = load i32, i32* %7
%234 = sext i32 %233 to i64
%235 = getelementptr inbounds i8*, i8** %232, i64 %234
%236 = load i8*, i8** %235
%237 = call i64 @strcmp(i8* %236, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.24, i64 0, i64 0))
%238 = icmp eq i64 %237, 0
br i1 %238, label %247, label %239
239: ; preds = %231
%240 = load i8**, i8*** %5
%241 = load i32, i32* %7
%242 = sext i32 %241 to i64
%243 = getelementptr inbounds i8*, i8** %240, i64 %242
%244 = load i8*, i8** %243
%245 = call i64 @strcmp(i8* %244, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.25, i64 0, i64 0))
%246 = icmp eq i64 %245, 0
br i1 %246, label %247, label %298
247: ; preds = %239, %231
%248 = load i32, i32* %7
%249 = add nsw i32 %248, 1
store i32 %249, i32* %7
%250 = load i8**, i8*** %5
%251 = load i32, i32* %7
%252 = sext i32 %251 to i64
%253 = getelementptr inbounds i8*, i8** %250, i64 %252
%254 = load i8*, i8** %253
%255 = call i64 @strcmp(i8* %254, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.26, i64 0, i64 0))
%256 = icmp eq i64 %255, 0
br i1 %256, label %265, label %257
257: ; preds = %247
%258 = load i8**, i8*** %5
%259 = load i32, i32* %7
%260 = sext i32 %259 to i64
%261 = getelementptr inbounds i8*, i8** %258, i64 %260
%262 = load i8*, i8** %261
%263 = call i64 @strcmp(i8* %262, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.27, i64 0, i64 0))
%264 = icmp eq i64 %263, 0
br i1 %264, label %265, label %271
265: ; preds = %257, %247
store i32 1, i32* %9
%266 = load i32, i32* %8
%267 = icmp ne i32 %266, 0
br i1 %267, label %268, label %270
268: ; preds = %265
%269 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.28, i64 0, i64 0))
br label %270
270: ; preds = %268, %265
br label %297
271: ; preds = %257
%272 = load i8**, i8*** %5
%273 = load i32, i32* %7
%274 = sext i32 %273 to i64
%275 = getelementptr inbounds i8*, i8** %272, i64 %274
%276 = load i8*, i8** %275
%277 = call i64 @strcmp(i8* %276, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.29, i64 0, i64 0))
%278 = icmp eq i64 %277, 0
br i1 %278, label %287, label %279
279: ; preds = %271
%280 = load i8**, i8*** %5
%281 = load i32, i32* %7
%282 = sext i32 %281 to i64
%283 = getelementptr inbounds i8*, i8** %280, i64 %282
%284 = load i8*, i8** %283
%285 = call i64 @strcmp(i8* %284, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.30, i64 0, i64 0))
%286 = icmp eq i64 %285, 0
br i1 %286, label %287, label %293
287: ; preds = %279, %271
store i32 0, i32* %9
%288 = load i32, i32* %8
%289 = icmp ne i32 %288, 0
br i1 %289, label %290, label %292
290: ; preds = %287
%291 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([48 x i8], [48 x i8]* @.str.31, i64 0, i64 0))
br label %292
292: ; preds = %290, %287
br label %296
293: ; preds = %279
%294 = load i32, i32* @stderr
%295 = call i32 @fprintf(i32 %294, i8* getelementptr inbounds ([66 x i8], [66 x i8]* @.str.32, i64 0, i64 0))
br label %296
296: ; preds = %293, %292
br label %297
297: ; preds = %296, %270
br label %298
298: ; preds = %297, %239
br label %299
299: ; preds = %298, %230
br label %300
300: ; preds = %299, %163
br label %301
301: ; preds = %300, %134
br label %302
302: ; preds = %301, %105
br label %303
303: ; preds = %302, %84
br label %304
304: ; preds = %303, %55
br label %305
305: ; preds = %304, %34
br label %306
306: ; preds = %305
%307 = load i32, i32* %7
%308 = add nsw i32 %307, 1
store i32 %308, i32* %7
br label %22
309: ; preds = %22
%310 = load i8*, i8** %11
%311 = icmp ne i8* %310, null
br i1 %311, label %312, label %328
312: ; preds = %309
%313 = load i8*, i8** %12
%314 = icmp ne i8* %313, null
br i1 %314, label %315, label %319
315: ; preds = %312
%316 = load i8*, i8** %11
%317 = load i8*, i8** %12
%318 = call i32 @recover(i8* %316, i8* %317)
store i32 %318, i32* %6
br label %327
319: ; preds = %312
%320 = call i64 @malloc(i32 5)
%321 = inttoptr i64 %320 to i8*
store i8* %321, i8** %12
store i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.33, i64 0, i64 0), i8** %12
%322 = load i8*, i8** %11
%323 = load i8*, i8** %12
%324 = call i32 @recover(i8* %322, i8* %323)
store i32 %324, i32* %6
%325 = load i8*, i8** %12
%326 = call i32 @free(i8* %325)
br label %327
327: ; preds = %319, %315
br label %349
328: ; preds = %309
%329 = load i8*, i8** %13
%330 = icmp ne i8* %329, null
br i1 %330, label %331, label %338
331: ; preds = %328
%332 = load i8*, i8** %13
%333 = load i8*, i8** %14
%334 = load i8*, i8** %14
%335 = load i32, i32* %9
%336 = load i32, i32* %10
%337 = call i32 @comprez(i8* %332, i8* %333, i8* %334, i32 %335, i32 %336)
store i32 %337, i32* %6
br label %348
338: ; preds = %328
%339 = load i8*, i8** %15
%340 = icmp ne i8* %339, null
br i1 %340, label %341, label %346
341: ; preds = %338
%342 = load i8*, i8** %15
%343 = load i8*, i8** %15
%344 = load i32, i32* %9
%345 = call i32 @decomprez(i8* %342, i8* %343, i32 %344)
store i32 %345, i32* %6
br label %347
346: ; preds = %338
store i32 -1, i32* %6
br label %347
347: ; preds = %346, %341
br label %348
348: ; preds = %347, %331
br label %349
349: ; preds = %348, %327
%350 = load i32, i32* %6
store i32 %350, i32* %3
br label %351
351: ; preds = %349, %18
%352 = load i32, i32* %3
ret i32 %352
}

LLVM IR (-O2):
@stderr = global i32 0
@.str = [19 x i8] c"not a valid syntax\00"
@.str.1 = [3 x i8] c"-v\00"
@.str.2 = [3 x i8] c"-p\00"
@.str.3 = [15 x i8] c"FilePath: %s \0A\00"
@.str.4 = [3 x i8] c"-i\00"
@.str.5 = [8 x i8] c"--image\00"
@.str.6 = [21 x i8] c"Image fileName: %s \0A\00"
@.str.7 = [3 x i8] c"-c\00"
@.str.8 = [21 x i8] c"FileToCompress: %s \0A\00"
@.str.9 = [3 x i8] c"-f\00"
@.str.10 = [7 x i8] c"--file\00"
@.str.11 = [27 x i8] c"Compressed file name: %s \0A\00"
@.str.12 = [3 x i8] c"-d\00"
@.str.13 = [12 x i8] c"--decomprez\00"
@.str.14 = [27 x i8] c"File to be decomprez: %s \0A\00"
@.str.15 = [3 x i8] c"-a\00"
@.str.16 = [7 x i8] c"--algo\00"
@.str.17 = [3 x i8] c"lb\00"
@.str.18 = [9 x i8] c"leastbit\00"
@.str.20 = [2 x i8] c"p\00"
@.str.21 = [5 x i8] c"prob\00"
@.str.23 = [70 x i8] c"syntax error expected lb or leastbit or p or prob after -a or --algo\0A\00"
@.str.24 = [3 x i8] c"-m\00"
@.str.25 = [7 x i8] c"--mode\00"
@.str.26 = [2 x i8] c"w\00"
@.str.27 = [5 x i8] c"word\00"
@.str.29 = [2 x i8] c"a\00"
@.str.30 = [6 x i8] c"ascii\00"
@.str.32 = [66 x i8] c"syntax error expected W or WORD or A or ASCII after -M or --MODE\0A\00"
@.str.33 = [3 x i8] c"./\00"
@str = [47 x i8] c"Compression by using ascii character analysis \00"
@str.34 = [36 x i8] c"Compressing by using word analysis \00"
@str.35 = [29 x i8] c"Algorithm used: probability \00"
@str.36 = [27 x i8] c"Algorithm used: least Bit \00"
define i32 @main(i32 %0, i8** nocapture %1) {
%3 = icmp eq i32 %0, 1
br i1 %3, label %6, label %4
4: ; preds = %2
%5 = icmp sgt i32 %0, 1
br i1 %5, label %9, label %202
6: ; preds = %2
%7 = load i32, i32* @stderr
%8 = tail call i32 @fprintf(i32 %7, i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i64 0, i64 0))
br label %202
9: ; preds = %4, %172
%10 = phi i8* [ %181, %172 ], [ null, %4 ]
%11 = phi i8* [ %180, %172 ], [ null, %4 ]
%12 = phi i8* [ %179, %172 ], [ null, %4 ]
%13 = phi i8* [ %178, %172 ], [ null, %4 ]
%14 = phi i8* [ %177, %172 ], [ null, %4 ]
%15 = phi i32 [ %176, %172 ], [ 0, %4 ]
%16 = phi i32 [ %175, %172 ], [ 0, %4 ]
%17 = phi i32 [ %174, %172 ], [ 0, %4 ]
%18 = phi i32 [ %182, %172 ], [ 1, %4 ]
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i8*, i8** %1, i64 %19
%21 = load i8*, i8** %20
%22 = tail call i64 @strcmp(i8* %21, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.1, i64 0, i64 0))
%23 = icmp eq i64 %22, 0
br i1 %23, label %172, label %24
24: ; preds = %9
%25 = load i8*, i8** %20
%26 = tail call i64 @strcmp(i8* %25, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0))
%27 = icmp eq i64 %26, 0
br i1 %27, label %28, label %36
28: ; preds = %24
%29 = add nsw i32 %18, 1
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds i8*, i8** %1, i64 %30
%32 = load i8*, i8** %31
%33 = icmp eq i32 %17, 0
br i1 %33, label %172, label %34
34: ; preds = %28
%35 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0), i8* %32)
br label %172
36: ; preds = %24
%37 = load i8*, i8** %20
%38 = tail call i64 @strcmp(i8* %37, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i64 0, i64 0))
%39 = icmp eq i64 %38, 0
br i1 %39, label %44, label %40
40: ; preds = %36
%41 = load i8*, i8** %20
%42 = tail call i64 @strcmp(i8* %41, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.5, i64 0, i64 0))
%43 = icmp eq i64 %42, 0
br i1 %43, label %44, label %52
44: ; preds = %40, %36
%45 = add nsw i32 %18, 1
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i8*, i8** %1, i64 %46
%48 = load i8*, i8** %47
%49 = icmp eq i32 %17, 0
br i1 %49, label %172, label %50
50: ; preds = %44
%51 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str.6, i64 0, i64 0), i8* %48)
br label %172
52: ; preds = %40
%53 = load i8*, i8** %20
%54 = tail call i64 @strcmp(i8* %53, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.7, i64 0, i64 0))
%55 = icmp eq i64 %54, 0
br i1 %55, label %56, label %64
56: ; preds = %52
%57 = add nsw i32 %18, 1
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8*, i8** %1, i64 %58
%60 = load i8*, i8** %59
%61 = icmp eq i32 %17, 0
br i1 %61, label %172, label %62
62: ; preds = %56
%63 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str.8, i64 0, i64 0), i8* %60)
br label %172
64: ; preds = %52
%65 = load i8*, i8** %20
%66 = tail call i64 @strcmp(i8* %65, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.9, i64 0, i64 0))
%67 = icmp eq i64 %66, 0
br i1 %67, label %72, label %68
68: ; preds = %64
%69 = load i8*, i8** %20
%70 = tail call i64 @strcmp(i8* %69, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.10, i64 0, i64 0))
%71 = icmp eq i64 %70, 0
br i1 %71, label %72, label %80
72: ; preds = %68, %64
%73 = add nsw i32 %18, 1
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i8*, i8** %1, i64 %74
%76 = load i8*, i8** %75
%77 = icmp eq i32 %17, 0
br i1 %77, label %172, label %78
78: ; preds = %72
%79 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([27 x i8], [27 x i8]* @.str.11, i64 0, i64 0), i8* %76)
br label %172
80: ; preds = %68
%81 = load i8*, i8** %20
%82 = tail call i64 @strcmp(i8* %81, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.12, i64 0, i64 0))
%83 = icmp eq i64 %82, 0
br i1 %83, label %88, label %84
84: ; preds = %80
%85 = load i8*, i8** %20
%86 = tail call i64 @strcmp(i8* %85, i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.13, i64 0, i64 0))
%87 = icmp eq i64 %86, 0
br i1 %87, label %88, label %96
88: ; preds = %84, %80
%89 = add nsw i32 %18, 1
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds i8*, i8** %1, i64 %90
%92 = load i8*, i8** %91
%93 = icmp eq i32 %17, 0
br i1 %93, label %172, label %94
94: ; preds = %88
%95 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([27 x i8], [27 x i8]* @.str.14, i64 0, i64 0), i8* %92)
br label %172
96: ; preds = %84
%97 = load i8*, i8** %20
%98 = tail call i64 @strcmp(i8* %97, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.15, i64 0, i64 0))
%99 = icmp eq i64 %98, 0
br i1 %99, label %104, label %100
100: ; preds = %96
%101 = load i8*, i8** %20
%102 = tail call i64 @strcmp(i8* %101, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.16, i64 0, i64 0))
%103 = icmp eq i64 %102, 0
br i1 %103, label %104, label %134
104: ; preds = %100, %96
%105 = add nsw i32 %18, 1
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds i8*, i8** %1, i64 %106
%108 = load i8*, i8** %107
%109 = tail call i64 @strcmp(i8* %108, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.17, i64 0, i64 0))
%110 = icmp eq i64 %109, 0
br i1 %110, label %115, label %111
111: ; preds = %104
%112 = load i8*, i8** %107
%113 = tail call i64 @strcmp(i8* %112, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.18, i64 0, i64 0))
%114 = icmp eq i64 %113, 0
br i1 %114, label %115, label %119
115: ; preds = %111, %104
%116 = icmp eq i32 %17, 0
br i1 %116, label %172, label %117
117: ; preds = %115
%118 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([27 x i8], [27 x i8]* @str.36, i64 0, i64 0))
br label %172
119: ; preds = %111
%120 = load i8*, i8** %107
%121 = tail call i64 @strcmp(i8* %120, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.20, i64 0, i64 0))
%122 = icmp eq i64 %121, 0
br i1 %122, label %127, label %123
123: ; preds = %119
%124 = load i8*, i8** %107
%125 = tail call i64 @strcmp(i8* %124, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.21, i64 0, i64 0))
%126 = icmp eq i64 %125, 0
br i1 %126, label %127, label %131
127: ; preds = %123, %119
%128 = icmp eq i32 %17, 0
br i1 %128, label %172, label %129
129: ; preds = %127
%130 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([29 x i8], [29 x i8]* @str.35, i64 0, i64 0))
br label %172
131: ; preds = %123
%132 = load i32, i32* @stderr
%133 = tail call i32 @fprintf(i32 %132, i8* getelementptr inbounds ([70 x i8], [70 x i8]* @.str.23, i64 0, i64 0))
br label %172
134: ; preds = %100
%135 = load i8*, i8** %20
%136 = tail call i64 @strcmp(i8* %135, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.24, i64 0, i64 0))
%137 = icmp eq i64 %136, 0
br i1 %137, label %142, label %138
138: ; preds = %134
%139 = load i8*, i8** %20
%140 = tail call i64 @strcmp(i8* %139, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.25, i64 0, i64 0))
%141 = icmp eq i64 %140, 0
br i1 %141, label %142, label %172
142: ; preds = %138, %134
%143 = add nsw i32 %18, 1
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8*, i8** %1, i64 %144
%146 = load i8*, i8** %145
%147 = tail call i64 @strcmp(i8* %146, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.26, i64 0, i64 0))
%148 = icmp eq i64 %147, 0
br i1 %148, label %153, label %149
149: ; preds = %142
%150 = load i8*, i8** %145
%151 = tail call i64 @strcmp(i8* %150, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.27, i64 0, i64 0))
%152 = icmp eq i64 %151, 0
br i1 %152, label %153, label %157
153: ; preds = %149, %142
%154 = icmp eq i32 %17, 0
br i1 %154, label %172, label %155
155: ; preds = %153
%156 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([36 x i8], [36 x i8]* @str.34, i64 0, i64 0))
br label %172
157: ; preds = %149
%158 = load i8*, i8** %145
%159 = tail call i64 @strcmp(i8* %158, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.29, i64 0, i64 0))
%160 = icmp eq i64 %159, 0
br i1 %160, label %165, label %161
161: ; preds = %157
%162 = load i8*, i8** %145
%163 = tail call i64 @strcmp(i8* %162, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.30, i64 0, i64 0))
%164 = icmp eq i64 %163, 0
br i1 %164, label %165, label %169
165: ; preds = %161, %157
%166 = icmp eq i32 %17, 0
br i1 %166, label %172, label %167
167: ; preds = %165
%168 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([47 x i8], [47 x i8]* @str, i64 0, i64 0))
br label %172
169: ; preds = %161
%170 = load i32, i32* @stderr
%171 = tail call i32 @fprintf(i32 %170, i8* getelementptr inbounds ([66 x i8], [66 x i8]* @.str.32, i64 0, i64 0))
br label %172
172: ; preds = %9, %50, %44, %78, %72, %131, %129, %127, %115, %117, %155, %153, %165, %167, %169, %138, %88, %94, %56, %62, %28, %34
%173 = phi i32 [ %29, %34 ], [ %29, %28 ], [ %45, %50 ], [ %45, %44 ], [ %57, %62 ], [ %57, %56 ], [ %73, %78 ], [ %73, %72 ], [ %89, %94 ], [ %89, %88 ], [ %105, %117 ], [ %105, %115 ], [ %105, %129 ], [ %105, %127 ], [ %105, %131 ], [ %143, %155 ], [ %143, %153 ], [ %143, %167 ], [ %143, %165 ], [ %143, %169 ], [ %18, %138 ], [ %18, %9 ]
%174 = phi i32 [ 1, %34 ], [ 0, %28 ], [ 1, %50 ], [ 0, %44 ], [ 1, %62 ], [ 0, %56 ], [ 1, %78 ], [ 0, %72 ], [ 1, %94 ], [ 0, %88 ], [ 1, %117 ], [ 0, %115 ], [ 1, %129 ], [ 0, %127 ], [ %17, %131 ], [ 1, %155 ], [ 0, %153 ], [ 1, %167 ], [ 0, %165 ], [ %17, %169 ], [ %17, %138 ], [ 1, %9 ]
%175 = phi i32 [ %16, %34 ], [ %16, %28 ], [ %16, %50 ], [ %16, %44 ], [ %16, %62 ], [ %16, %56 ], [ %16, %78 ], [ %16, %72 ], [ %16, %94 ], [ %16, %88 ], [ %16, %117 ], [ %16, %115 ], [ %16, %129 ], [ %16, %127 ], [ %16, %131 ], [ 1, %155 ], [ 1, %153 ], [ 0, %167 ], [ 0, %165 ], [ %16, %169 ], [ %16, %138 ], [ %16, %9 ]
%176 = phi i32 [ %15, %34 ], [ %15, %28 ], [ %15, %50 ], [ %15, %44 ], [ %15, %62 ], [ %15, %56 ], [ %15, %78 ], [ %15, %72 ], [ %15, %94 ], [ %15, %88 ], [ 0, %117 ], [ 0, %115 ], [ 1, %129 ], [ 1, %127 ], [ %15, %131 ], [ %15, %155 ], [ %15, %153 ], [ %15, %167 ], [ %15, %165 ], [ %15, %169 ], [ %15, %138 ], [ %15, %9 ]
%177 = phi i8* [ %14, %34 ], [ %14, %28 ], [ %48, %50 ], [ %48, %44 ], [ %14, %62 ], [ %14, %56 ], [ %14, %78 ], [ %14, %72 ], [ %14, %94 ], [ %14, %88 ], [ %14, %117 ], [ %14, %115 ], [ %14, %129 ], [ %14, %127 ], [ %14, %131 ], [ %14, %155 ], [ %14, %153 ], [ %14, %167 ], [ %14, %165 ], [ %14, %169 ], [ %14, %138 ], [ %14, %9 ]
%178 = phi i8* [ %32, %34 ], [ %32, %28 ], [ %13, %50 ], [ %13, %44 ], [ %13, %62 ], [ %13, %56 ], [ %13, %78 ], [ %13, %72 ], [ %13, %94 ], [ %13, %88 ], [ %13, %117 ], [ %13, %115 ], [ %13, %129 ], [ %13, %127 ], [ %13, %131 ], [ %13, %155 ], [ %13, %153 ], [ %13, %167 ], [ %13, %165 ], [ %13, %169 ], [ %13, %138 ], [ %13, %9 ]
%179 = phi i8* [ %12, %34 ], [ %12, %28 ], [ %12, %50 ], [ %12, %44 ], [ %60, %62 ], [ %60, %56 ], [ %12, %78 ], [ %12, %72 ], [ %12, %94 ], [ %12, %88 ], [ %12, %117 ], [ %12, %115 ], [ %12, %129 ], [ %12, %127 ], [ %12, %131 ], [ %12, %155 ], [ %12, %153 ], [ %12, %167 ], [ %12, %165 ], [ %12, %169 ], [ %12, %138 ], [ %12, %9 ]
%180 = phi i8* [ %11, %34 ], [ %11, %28 ], [ %11, %50 ], [ %11, %44 ], [ %11, %62 ], [ %11, %56 ], [ %76, %78 ], [ %76, %72 ], [ %11, %94 ], [ %11, %88 ], [ %11, %117 ], [ %11, %115 ], [ %11, %129 ], [ %11, %127 ], [ %11, %131 ], [ %11, %155 ], [ %11, %153 ], [ %11, %167 ], [ %11, %165 ], [ %11, %169 ], [ %11, %138 ], [ %11, %9 ]
%181 = phi i8* [ %10, %34 ], [ %10, %28 ], [ %10, %50 ], [ %10, %44 ], [ %10, %62 ], [ %10, %56 ], [ %10, %78 ], [ %10, %72 ], [ %92, %94 ], [ %92, %88 ], [ %10, %117 ], [ %10, %115 ], [ %10, %129 ], [ %10, %127 ], [ %10, %131 ], [ %10, %155 ], [ %10, %153 ], [ %10, %167 ], [ %10, %165 ], [ %10, %169 ], [ %10, %138 ], [ %10, %9 ]
%182 = add nsw i32 %173, 1
%183 = icmp slt i32 %182, %0
br i1 %183, label %9, label %184
184: ; preds = %172
%185 = icmp eq i8* %177, null
br i1 %185, label %194, label %186
186: ; preds = %184
%187 = icmp eq i8* %178, null
br i1 %187, label %190, label %188
188: ; preds = %186
%189 = tail call i32 @recover(i8* %177, i8* %178)
br label %202
190: ; preds = %186
%191 = tail call i64 @malloc(i32 5)
%192 = tail call i32 @recover(i8* %177, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.33, i64 0, i64 0))
%193 = tail call i32 @free(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.33, i64 0, i64 0))
br label %202
194: ; preds = %184
%195 = icmp eq i8* %179, null
br i1 %195, label %198, label %196
196: ; preds = %194
%197 = tail call i32 @comprez(i8* %179, i8* %180, i8* %180, i32 %175, i32 %176)
br label %202
198: ; preds = %194
%199 = icmp eq i8* %181, null
br i1 %199, label %202, label %200
200: ; preds = %198
%201 = tail call i32 @decomprez(i8* %181, i8* %181, i32 %175)
br label %202
202: ; preds = %4, %190, %188, %200, %196, %198, %6
%203 = phi i32 [ -1, %6 ], [ %189, %188 ], [ %192, %190 ], [ %197, %196 ], [ %201, %200 ], [ -1, %198 ], [ -1, %4 ]
ret i32 %203
}