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

/* Forward declarations */

/* Type definitions */
struct stat {
  int st_mode;
};

/* Variables and functions */
int S_IRUSR;
int S_IWUSR;
int S_IXUSR;
int /*<<< orphan*/ chmod(char const *, int);
int /*<<< orphan*/ printf(char *, ...);
scalar_t__ stat(char *, struct stat *);
scalar_t__ strcmp(char *, char *);
void chmode(char *file, char *mode) {
  struct stat statRes;
  if (stat(file, &statRes) < 0) {
    printf("Error, %s does not exists\n", file);
    return;
  }
  int r = 0, w = 0, e = 0;
  if (!((statRes.st_mode & S_IXUSR) == 0))
    e = 1;
  if (!((statRes.st_mode & S_IWUSR) == 0))
    w = 1;
  if (!((statRes.st_mode & S_IRUSR) == 0))
    r = 1;
  if (strcmp(mode, "x") == 0) {
    if (w == 1 && r == 1)
      chmod((const char *)file, S_IRUSR | S_IWUSR | S_IXUSR);
    else if (w == 0 && r == 1)
      chmod((const char *)file, S_IRUSR | !S_IWUSR | S_IXUSR);
    else if (w == 1 && r == 0)
      chmod((const char *)file, !S_IRUSR | S_IWUSR | S_IXUSR);
    else
      chmod((const char *)file, !S_IRUSR | !S_IWUSR | S_IXUSR);
  } else if (strcmp(mode, "w") == 0) {
    if (r == 1 && e == 1)
      chmod((const char *)file, S_IRUSR | S_IWUSR | S_IXUSR);
    else if (r == 0 && e == 1)
      chmod((const char *)file, !S_IRUSR | S_IWUSR | S_IXUSR);
    else if (r == 1 && e == 0)
      chmod((const char *)file, S_IRUSR | S_IWUSR | !S_IXUSR);
    else
      chmod((const char *)file, !S_IRUSR | S_IWUSR | !S_IXUSR);
  } else if (strcmp(mode, "r") == 0) {
    if (w == 1 && e == 1)
      chmod((const char *)file, S_IRUSR | S_IWUSR | S_IXUSR);
    else if (w == 0 && e == 1)
      chmod((const char *)file, S_IRUSR | !S_IWUSR | S_IXUSR);
    else if (w == 1 && e == 0)
      chmod((const char *)file, S_IRUSR | S_IWUSR | !S_IXUSR);
    else
      chmod((const char *)file, S_IRUSR | !S_IWUSR | !S_IXUSR);
  } else if (strcmp(mode, "-x") == 0) {
    if (r == 1 && w == 1)
      chmod((const char *)file, S_IRUSR | S_IWUSR | !S_IXUSR);
    else if (r == 1 && w == 0)
      chmod((const char *)file, S_IRUSR | !S_IWUSR | !S_IXUSR);
    else if (r == 0 && w == 1)
      chmod((const char *)file, !S_IRUSR | S_IWUSR | !S_IXUSR);
    else
      chmod((const char *)file, !S_IRUSR | !S_IWUSR | !S_IXUSR);
  } else if (strcmp(mode, "-w") == 0) {
    if (r == 1 && e == 1)
      chmod((const char *)file, S_IRUSR | !S_IWUSR | S_IXUSR);
    else if (r == 1 && e == 0)
      chmod((const char *)file, S_IRUSR | !S_IWUSR | !S_IXUSR);
    else if (r == 0 && e == 1)
      chmod((const char *)file, !S_IRUSR | !S_IWUSR | S_IXUSR);
    else
      chmod((const char *)file, !S_IRUSR | !S_IWUSR | !S_IXUSR);
  } else if (strcmp(mode, "-r") == 0) {
    if (w == 1 && e == 1)
      chmod((const char *)file, !S_IRUSR | S_IWUSR | S_IXUSR);
    else if (w == 0 && e == 1)
      chmod((const char *)file, !S_IRUSR | !S_IWUSR | S_IXUSR);
    else if (w == 1 && e == 0)
      chmod((const char *)file, !S_IRUSR | S_IWUSR | !S_IXUSR);
    else
      chmod((const char *)file, !S_IRUSR | !S_IWUSR | !S_IXUSR);
  } else
    printf("Errore, modalita' non trovata.\n");
}


x86 assembly (clang, -O0):
<chmode>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rdi
lea    -0x18(%rbp),%rsi
call   1050 <stat@plt>
cmp    $0x0,%rax
jge    117e <chmode+0x3e>
mov    -0x8(%rbp),%rsi
lea    0xe8e(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
jmp    19e2 <chmode+0x8a2>
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x18(%rbp),%eax
mov    0x2e4b(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     11af <chmode+0x6f>
movl   $0x1,-0x24(%rbp)
mov    -0x18(%rbp),%eax
mov    0x2e27(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     11cb <chmode+0x8b>
movl   $0x1,-0x20(%rbp)
mov    -0x18(%rbp),%eax
mov    0x2dfb(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     11e7 <chmode+0xa7>
movl   $0x1,-0x1c(%rbp)
mov    -0x10(%rbp),%rdi
lea    0xe2a(%rip),%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%rax
jne    131b <chmode+0x1db>
cmpl   $0x1,-0x20(%rbp)
jne    123e <chmode+0xfe>
cmpl   $0x1,-0x1c(%rbp)
jne    123e <chmode+0xfe>
mov    -0x8(%rbp),%rdi
mov    0x2db0(%rip),%rax
mov    (%rax),%esi
mov    0x2db7(%rip),%rax
or     (%rax),%esi
mov    0x2db6(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    1316 <chmode+0x1d6>
cmpl   $0x0,-0x20(%rbp)
jne    1288 <chmode+0x148>
cmpl   $0x1,-0x1c(%rbp)
jne    1288 <chmode+0x148>
mov    -0x8(%rbp),%rdi
mov    0x2d73(%rip),%rax
mov    (%rax),%esi
mov    0x2d7a(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x2d6c(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    1311 <chmode+0x1d1>
cmpl   $0x1,-0x20(%rbp)
jne    12d0 <chmode+0x190>
cmpl   $0x0,-0x1c(%rbp)
jne    12d0 <chmode+0x190>
mov    -0x8(%rbp),%rdi
mov    0x2d29(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x2d25(%rip),%rax
or     (%rax),%esi
mov    0x2d24(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    130c <chmode+0x1cc>
mov    -0x8(%rbp),%rdi
mov    0x2cf5(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x2cf1(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x2ce3(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    1311 <chmode+0x1d1>
jmp    1316 <chmode+0x1d6>
jmp    19e2 <chmode+0x8a2>
mov    -0x10(%rbp),%rdi
lea    0xcf9(%rip),%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%rax
jne    144f <chmode+0x30f>
cmpl   $0x1,-0x1c(%rbp)
jne    1372 <chmode+0x232>
cmpl   $0x1,-0x24(%rbp)
jne    1372 <chmode+0x232>
mov    -0x8(%rbp),%rdi
mov    0x2c7c(%rip),%rax
mov    (%rax),%esi
mov    0x2c83(%rip),%rax
or     (%rax),%esi
mov    0x2c82(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    144a <chmode+0x30a>
cmpl   $0x0,-0x1c(%rbp)
jne    13ba <chmode+0x27a>
cmpl   $0x1,-0x24(%rbp)
jne    13ba <chmode+0x27a>
mov    -0x8(%rbp),%rdi
mov    0x2c3f(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x2c3b(%rip),%rax
or     (%rax),%esi
mov    0x2c3a(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    1445 <chmode+0x305>
cmpl   $0x1,-0x1c(%rbp)
jne    1404 <chmode+0x2c4>
cmpl   $0x0,-0x24(%rbp)
jne    1404 <chmode+0x2c4>
mov    -0x8(%rbp),%rdi
mov    0x2bf7(%rip),%rax
mov    (%rax),%esi
mov    0x2bfe(%rip),%rax
or     (%rax),%esi
mov    0x2bfd(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    1440 <chmode+0x300>
mov    -0x8(%rbp),%rdi
mov    0x2bc1(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x2bbd(%rip),%rax
or     (%rax),%esi
mov    0x2bbc(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    1445 <chmode+0x305>
jmp    144a <chmode+0x30a>
jmp    19dd <chmode+0x89d>
mov    -0x10(%rbp),%rdi
lea    0xbc8(%rip),%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%rax
jne    1587 <chmode+0x447>
cmpl   $0x1,-0x20(%rbp)
jne    14a6 <chmode+0x366>
cmpl   $0x1,-0x24(%rbp)
jne    14a6 <chmode+0x366>
mov    -0x8(%rbp),%rdi
mov    0x2b48(%rip),%rax
mov    (%rax),%esi
mov    0x2b4f(%rip),%rax
or     (%rax),%esi
mov    0x2b4e(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    1582 <chmode+0x442>
cmpl   $0x0,-0x20(%rbp)
jne    14f0 <chmode+0x3b0>
cmpl   $0x1,-0x24(%rbp)
jne    14f0 <chmode+0x3b0>
mov    -0x8(%rbp),%rdi
mov    0x2b0b(%rip),%rax
mov    (%rax),%esi
mov    0x2b12(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x2b04(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    157d <chmode+0x43d>
cmpl   $0x1,-0x20(%rbp)
jne    153a <chmode+0x3fa>
cmpl   $0x0,-0x24(%rbp)
jne    153a <chmode+0x3fa>
mov    -0x8(%rbp),%rdi
mov    0x2ac1(%rip),%rax
mov    (%rax),%esi
mov    0x2ac8(%rip),%rax
or     (%rax),%esi
mov    0x2ac7(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    1578 <chmode+0x438>
mov    -0x8(%rbp),%rdi
mov    0x2a8b(%rip),%rax
mov    (%rax),%esi
mov    0x2a92(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x2a84(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    157d <chmode+0x43d>
jmp    1582 <chmode+0x442>
jmp    19d8 <chmode+0x898>
mov    -0x10(%rbp),%rdi
lea    0xa89(%rip),%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%rax
jne    16ef <chmode+0x5af>
cmpl   $0x1,-0x1c(%rbp)
jne    15eb <chmode+0x4ab>
cmpl   $0x1,-0x20(%rbp)
jne    15eb <chmode+0x4ab>
mov    -0x8(%rbp),%rdi
mov    0x2a10(%rip),%rax
mov    (%rax),%esi
mov    0x2a17(%rip),%rax
or     (%rax),%esi
mov    0x2a16(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    16ea <chmode+0x5aa>
cmpl   $0x1,-0x1c(%rbp)
jne    1642 <chmode+0x502>
cmpl   $0x0,-0x20(%rbp)
jne    1642 <chmode+0x502>
mov    -0x8(%rbp),%rdi
mov    0x29c6(%rip),%rax
mov    (%rax),%esi
mov    0x29cd(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x29bf(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    16e5 <chmode+0x5a5>
cmpl   $0x0,-0x1c(%rbp)
jne    1697 <chmode+0x557>
cmpl   $0x1,-0x20(%rbp)
jne    1697 <chmode+0x557>
mov    -0x8(%rbp),%rdi
mov    0x296f(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x296b(%rip),%rax
or     (%rax),%esi
mov    0x296a(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    16e0 <chmode+0x5a0>
mov    -0x8(%rbp),%rdi
mov    0x292e(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x292a(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x291c(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    16e5 <chmode+0x5a5>
jmp    16ea <chmode+0x5aa>
jmp    19d3 <chmode+0x893>
mov    -0x10(%rbp),%rdi
lea    0x924(%rip),%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%rax
jne    1857 <chmode+0x717>
cmpl   $0x1,-0x1c(%rbp)
jne    1753 <chmode+0x613>
cmpl   $0x1,-0x24(%rbp)
jne    1753 <chmode+0x613>
mov    -0x8(%rbp),%rdi
mov    0x28a8(%rip),%rax
mov    (%rax),%esi
mov    0x28af(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x28a1(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    1852 <chmode+0x712>
cmpl   $0x1,-0x1c(%rbp)
jne    17aa <chmode+0x66a>
cmpl   $0x0,-0x24(%rbp)
jne    17aa <chmode+0x66a>
mov    -0x8(%rbp),%rdi
mov    0x285e(%rip),%rax
mov    (%rax),%esi
mov    0x2865(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x2857(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    184d <chmode+0x70d>
cmpl   $0x0,-0x1c(%rbp)
jne    17ff <chmode+0x6bf>
cmpl   $0x1,-0x24(%rbp)
jne    17ff <chmode+0x6bf>
mov    -0x8(%rbp),%rdi
mov    0x2807(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x2803(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x27f5(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    1848 <chmode+0x708>
mov    -0x8(%rbp),%rdi
mov    0x27c6(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x27c2(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x27b4(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    184d <chmode+0x70d>
jmp    1852 <chmode+0x712>
jmp    19ce <chmode+0x88e>
mov    -0x10(%rbp),%rdi
lea    0x7bf(%rip),%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%rax
jne    19bb <chmode+0x87b>
cmpl   $0x1,-0x20(%rbp)
jne    18b9 <chmode+0x779>
cmpl   $0x1,-0x24(%rbp)
jne    18b9 <chmode+0x779>
mov    -0x8(%rbp),%rdi
mov    0x2740(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x273c(%rip),%rax
or     (%rax),%esi
mov    0x273b(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    19b6 <chmode+0x876>
cmpl   $0x0,-0x20(%rbp)
jne    190e <chmode+0x7ce>
cmpl   $0x1,-0x24(%rbp)
jne    190e <chmode+0x7ce>
mov    -0x8(%rbp),%rdi
mov    0x26f8(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x26f4(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x26e6(%rip),%rax
or     (%rax),%esi
call   1060 <chmod@plt>
jmp    19b1 <chmode+0x871>
cmpl   $0x1,-0x20(%rbp)
jne    1963 <chmode+0x823>
cmpl   $0x0,-0x24(%rbp)
jne    1963 <chmode+0x823>
mov    -0x8(%rbp),%rdi
mov    0x26a3(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x269f(%rip),%rax
or     (%rax),%esi
mov    0x269e(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    19ac <chmode+0x86c>
mov    -0x8(%rbp),%rdi
mov    0x2662(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%esi
mov    0x265e(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
mov    0x2650(%rip),%rax
cmpl   $0x0,(%rax)
setne  %al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
or     %eax,%esi
call   1060 <chmod@plt>
jmp    19b1 <chmode+0x871>
jmp    19b6 <chmode+0x876>
jmp    19c9 <chmode+0x889>
lea    0x662(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
jmp    19ce <chmode+0x88e>
jmp    19d3 <chmode+0x893>
jmp    19d8 <chmode+0x898>
jmp    19dd <chmode+0x89d>
jmp    19e2 <chmode+0x8a2>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<chmode>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %rsi,%rbx
mov    %rdi,%rbp
lea    0x20(%rsp),%rsi
call   1060 <stat@plt>
test   %rax,%rax
js     125c <chmode+0x10c>
mov    %rbp,0x10(%rsp)
mov    0x20(%rsp),%ebp
mov    0x2e61(%rip),%rax
mov    (%rax),%eax
mov    %eax,0x1c(%rsp)
test   %ebp,%eax
setne  0xe(%rsp)
mov    0x2e45(%rip),%rax
mov    (%rax),%r15d
test   %ebp,%r15d
setne  %r12b
mov    0x2e24(%rip),%rax
mov    (%rax),%r14d
test   %ebp,%r14d
setne  %r13b
lea    0xe5f(%rip),%rsi
mov    %rbx,%rdi
call   1050 <strcmp@plt>
test   %rax,%rax
je     1272 <chmode+0x122>
mov    %r12b,0xf(%rsp)
lea    0xe45(%rip),%rsi
mov    %rbx,%rdi
call   1050 <strcmp@plt>
test   %rax,%rax
je     12b6 <chmode+0x166>
lea    0xe30(%rip),%rsi
mov    %rbx,%rdi
call   1050 <strcmp@plt>
test   %rax,%rax
je     12fc <chmode+0x1ac>
lea    0xe11(%rip),%rsi
mov    %rbx,%rdi
call   1050 <strcmp@plt>
test   %rax,%rax
je     1321 <chmode+0x1d1>
lea    0xdfc(%rip),%rsi
mov    %rbx,%rdi
call   1050 <strcmp@plt>
test   %rax,%rax
je     1377 <chmode+0x227>
lea    0xde7(%rip),%rsi
mov    %rbx,%rdi
call   1050 <strcmp@plt>
test   %rax,%rax
je     1418 <chmode+0x2c8>
lea    0xdd2(%rip),%rdi
call   1030 <puts@plt>
jmp    1494 <chmode+0x344>
lea    0xd9d(%rip),%rdi
mov    %rbp,%rsi
xor    %eax,%eax
call   1040 <printf@plt>
jmp    1494 <chmode+0x344>
mov    %r12d,%eax
and    %r13b,%al
cmp    $0x1,%al
je     130c <chmode+0x1bc>
test   %ebp,%r15d
sete   %al
and    %r13b,%al
cmp    $0x1,%al
je     1388 <chmode+0x238>
test   %ebp,%r14d
sete   %al
and    %al,%r12b
mov    0x2d2f(%rip),%rax
mov    (%rax),%eax
cmp    $0x1,%r12b
jne    13ae <chmode+0x25e>
xor    %esi,%esi
test   %eax,%eax
jmp    1438 <chmode+0x2e8>
mov    %r13d,%eax
mov    0xe(%rsp),%cl
and    %cl,%al
cmp    $0x1,%al
je     130c <chmode+0x1bc>
test   %ebp,%r14d
sete   %al
and    %cl,%al
cmp    $0x1,%al
je     142c <chmode+0x2dc>
test   %ebp,0x1c(%rsp)
sete   %al
and    %al,%r13b
mov    0x2cec(%rip),%rax
mov    (%rax),%eax
cmp    $0x1,%r13b
jne    13f4 <chmode+0x2a4>
mov    0x2ce9(%rip),%rcx
jmp    1476 <chmode+0x326>
mov    0xf(%rsp),%dl
mov    %edx,%eax
mov    0xe(%rsp),%cl
and    %cl,%al
cmp    $0x1,%al
jne    1340 <chmode+0x1f0>
mov    0x2ccd(%rip),%rax
mov    (%rax),%esi
mov    0x2cb4(%rip),%rax
jmp    1443 <chmode+0x2f3>
mov    %r13d,%eax
mov    0xf(%rsp),%dl
and    %dl,%al
cmp    $0x1,%al
jne    13c7 <chmode+0x277>
mov    0x2ca7(%rip),%rax
mov    (%rax),%eax
jmp    146f <chmode+0x31f>
test   %ebp,%r15d
sete   %al
and    %cl,%al
cmp    $0x1,%al
je     1388 <chmode+0x238>
test   %ebp,0x1c(%rsp)
sete   %al
and    %al,%dl
mov    0x2c74(%rip),%rax
mov    (%rax),%eax
mov    0x2c7b(%rip),%rcx
mov    (%rcx),%ecx
cmp    $0x1,%dl
jne    14a3 <chmode+0x353>
or     %eax,%ecx
jmp    1404 <chmode+0x2b4>
mov    %r13d,%eax
mov    0xe(%rsp),%dl
and    %dl,%al
cmp    $0x1,%al
jne    1450 <chmode+0x300>
xor    %eax,%eax
mov    0x2c4f(%rip),%rcx
cmpl   $0x0,(%rcx)
sete   %al
mov    0x2c4a(%rip),%rcx
mov    (%rcx),%esi
mov    0x2c29(%rip),%rcx
or     (%rcx),%esi
jmp    1488 <chmode+0x338>
test   %eax,%eax
sete   %al
mov    0x2c26(%rip),%rcx
cmpl   $0x0,(%rcx)
sete   %cl
or     %al,%cl
movzbl %cl,%esi
jmp    1445 <chmode+0x2f5>
test   %ebp,%r15d
sete   %al
and    %al,%r13b
cmp    $0x1,%r13b
je     1460 <chmode+0x310>
test   %ebp,%r14d
sete   %cl
and    %dl,%cl
mov    0x2be7(%rip),%rax
mov    (%rax),%eax
cmp    $0x1,%cl
jne    14fa <chmode+0x3aa>
xor    %ecx,%ecx
test   %eax,%eax
sete   %cl
mov    0x2bde(%rip),%rax
or     (%rax),%ecx
xor    %esi,%esi
mov    0x2bdb(%rip),%rax
cmpl   $0x0,(%rax)
sete   %sil
or     %ecx,%esi
jmp    148a <chmode+0x33a>
mov    0xf(%rsp),%cl
mov    %ecx,%eax
mov    0xe(%rsp),%dl
and    %dl,%al
cmp    $0x1,%al
jne    14ae <chmode+0x35e>
xor    %esi,%esi
mov    0x2b9b(%rip),%rax
cmpl   $0x0,(%rax)
sete   %sil
mov    0x2b9d(%rip),%rax
or     (%rax),%esi
mov    0x2b9c(%rip),%rax
or     (%rax),%esi
jmp    148a <chmode+0x33a>
test   %ebp,0x1c(%rsp)
sete   %al
and    %al,%r13b
cmp    $0x1,%r13b
jne    14c9 <chmode+0x379>
xor    %eax,%eax
mov    0x2b77(%rip),%rcx
cmpl   $0x0,(%rcx)
sete   %al
mov    0x2b5a(%rip),%rcx
or     (%rcx),%eax
xor    %esi,%esi
mov    0x2b67(%rip),%rcx
cmpl   $0x0,(%rcx)
sete   %sil
or     %eax,%esi
mov    0x10(%rsp),%rdi
call   1070 <chmod@plt>
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %edx,%edx
test   %ecx,%ecx
sete   %dl
or     %edx,%eax
jmp    1478 <chmode+0x328>
test   %ebp,%r15d
sete   %al
and    %dl,%al
cmp    $0x1,%al
jne    151d <chmode+0x3cd>
mov    0x2b0f(%rip),%rax
cmpl   $0x0,(%rax)
jmp    13b0 <chmode+0x260>
test   %ebp,%r14d
sete   %cl
and    %dl,%cl
mov    0x2af8(%rip),%rax
cmpl   $0x0,(%rax)
sete   %dl
mov    0x2afb(%rip),%rax
cmpl   $0x0,(%rax)
sete   %al
or     %dl,%al
cmp    $0x1,%cl
jne    1560 <chmode+0x410>
movzbl %al,%esi
jmp    1445 <chmode+0x2f5>
test   %eax,%eax
sete   %al
mov    0x2ada(%rip),%rcx
cmpl   $0x0,(%rcx)
sete   %cl
or     %al,%cl
mov    0x2ad3(%rip),%rax
cmpl   $0x0,(%rax)
sete   %al
jmp    156d <chmode+0x41d>
test   %ebp,0x1c(%rsp)
sete   %al
and    %al,%cl
mov    0x2aa3(%rip),%rax
mov    (%rax),%eax
cmp    $0x1,%cl
mov    0x10(%rsp),%rdi
mov    0x2aaa(%rip),%rdx
mov    0x2a9b(%rip),%rsi
jne    1577 <chmode+0x427>
xor    %ecx,%ecx
test   %eax,%eax
sete   %cl
or     (%rsi),%ecx
xor    %esi,%esi
cmpl   $0x0,(%rdx)
sete   %sil
or     %ecx,%esi
jmp    148f <chmode+0x33f>
mov    0x2a81(%rip),%rcx
cmpl   $0x0,(%rcx)
sete   %cl
or     %cl,%al
movzbl %al,%esi
jmp    148a <chmode+0x33a>
test   %eax,%eax
sete   %al
cmpl   $0x0,(%rsi)
sete   %cl
or     %al,%cl
cmpl   $0x0,(%rdx)
sete   %al
or     %cl,%al
movzbl %al,%esi
jmp    148f <chmode+0x33f>

LLVM IR (-O0):
%struct.stat = type { i32 }
@.str = [27 x i8] c"Error, %s does not exists\0A\00"
@S_IXUSR = global i32 0
@S_IWUSR = global i32 0
@S_IRUSR = global i32 0
@.str.1 = [2 x i8] c"x\00"
@.str.2 = [2 x i8] c"w\00"
@.str.3 = [2 x i8] c"r\00"
@.str.4 = [3 x i8] c"-x\00"
@.str.5 = [3 x i8] c"-w\00"
@.str.6 = [3 x i8] c"-r\00"
@.str.7 = [32 x i8] c"Errore, modalita' non trovata.\0A\00"
define void @chmode(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca %struct.stat
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i8* %0, i8** %3
store i8* %1, i8** %4
%9 = load i8*, i8** %3
%10 = call i64 @stat(i8* %9, %struct.stat* %5)
%11 = icmp slt i64 %10, 0
br i1 %11, label %12, label %15
12: ; preds = %2
%13 = load i8*, i8** %3
%14 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str, i64 0, i64 0), i8* %13)
br label %493
15: ; preds = %2
store i32 0, i32* %6
store i32 0, i32* %7
store i32 0, i32* %8
%16 = getelementptr inbounds %struct.stat, %struct.stat* %5, i32 0, i32 0
%17 = load i32, i32* %16
%18 = load i32, i32* @S_IXUSR
%19 = and i32 %17, %18
%20 = icmp eq i32 %19, 0
br i1 %20, label %22, label %21
21: ; preds = %15
store i32 1, i32* %8
br label %22
22: ; preds = %21, %15
%23 = getelementptr inbounds %struct.stat, %struct.stat* %5, i32 0, i32 0
%24 = load i32, i32* %23
%25 = load i32, i32* @S_IWUSR
%26 = and i32 %24, %25
%27 = icmp eq i32 %26, 0
br i1 %27, label %29, label %28
28: ; preds = %22
store i32 1, i32* %7
br label %29
29: ; preds = %28, %22
%30 = getelementptr inbounds %struct.stat, %struct.stat* %5, i32 0, i32 0
%31 = load i32, i32* %30
%32 = load i32, i32* @S_IRUSR
%33 = and i32 %31, %32
%34 = icmp eq i32 %33, 0
br i1 %34, label %36, label %35
35: ; preds = %29
store i32 1, i32* %6
br label %36
36: ; preds = %35, %29
%37 = load i8*, i8** %4
%38 = call i64 @strcmp(i8* %37, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%39 = icmp eq i64 %38, 0
br i1 %39, label %40, label %105
40: ; preds = %36
%41 = load i32, i32* %7
%42 = icmp eq i32 %41, 1
br i1 %42, label %43, label %54
43: ; preds = %40
%44 = load i32, i32* %6
%45 = icmp eq i32 %44, 1
br i1 %45, label %46, label %54
46: ; preds = %43
%47 = load i8*, i8** %3
%48 = load i32, i32* @S_IRUSR
%49 = load i32, i32* @S_IWUSR
%50 = or i32 %48, %49
%51 = load i32, i32* @S_IXUSR
%52 = or i32 %50, %51
%53 = call i32 @chmod(i8* %47, i32 %52)
br label %104
54: ; preds = %43, %40
%55 = load i32, i32* %7
%56 = icmp eq i32 %55, 0
br i1 %56, label %57, label %71
57: ; preds = %54
%58 = load i32, i32* %6
%59 = icmp eq i32 %58, 1
br i1 %59, label %60, label %71
60: ; preds = %57
%61 = load i8*, i8** %3
%62 = load i32, i32* @S_IRUSR
%63 = load i32, i32* @S_IWUSR
%64 = icmp ne i32 %63, 0
%65 = xor i1 %64, true
%66 = zext i1 %65 to i32
%67 = or i32 %62, %66
%68 = load i32, i32* @S_IXUSR
%69 = or i32 %67, %68
%70 = call i32 @chmod(i8* %61, i32 %69)
br label %103
71: ; preds = %57, %54
%72 = load i32, i32* %7
%73 = icmp eq i32 %72, 1
br i1 %73, label %74, label %88
74: ; preds = %71
%75 = load i32, i32* %6
%76 = icmp eq i32 %75, 0
br i1 %76, label %77, label %88
77: ; preds = %74
%78 = load i8*, i8** %3
%79 = load i32, i32* @S_IRUSR
%80 = icmp ne i32 %79, 0
%81 = xor i1 %80, true
%82 = zext i1 %81 to i32
%83 = load i32, i32* @S_IWUSR
%84 = or i32 %82, %83
%85 = load i32, i32* @S_IXUSR
%86 = or i32 %84, %85
%87 = call i32 @chmod(i8* %78, i32 %86)
br label %102
88: ; preds = %74, %71
%89 = load i8*, i8** %3
%90 = load i32, i32* @S_IRUSR
%91 = icmp ne i32 %90, 0
%92 = xor i1 %91, true
%93 = zext i1 %92 to i32
%94 = load i32, i32* @S_IWUSR
%95 = icmp ne i32 %94, 0
%96 = xor i1 %95, true
%97 = zext i1 %96 to i32
%98 = or i32 %93, %97
%99 = load i32, i32* @S_IXUSR
%100 = or i32 %98, %99
%101 = call i32 @chmod(i8* %89, i32 %100)
br label %102
102: ; preds = %88, %77
br label %103
103: ; preds = %102, %60
br label %104
104: ; preds = %103, %46
br label %493
105: ; preds = %36
%106 = load i8*, i8** %4
%107 = call i64 @strcmp(i8* %106, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i64 0, i64 0))
%108 = icmp eq i64 %107, 0
br i1 %108, label %109, label %174
109: ; preds = %105
%110 = load i32, i32* %6
%111 = icmp eq i32 %110, 1
br i1 %111, label %112, label %123
112: ; preds = %109
%113 = load i32, i32* %8
%114 = icmp eq i32 %113, 1
br i1 %114, label %115, label %123
115: ; preds = %112
%116 = load i8*, i8** %3
%117 = load i32, i32* @S_IRUSR
%118 = load i32, i32* @S_IWUSR
%119 = or i32 %117, %118
%120 = load i32, i32* @S_IXUSR
%121 = or i32 %119, %120
%122 = call i32 @chmod(i8* %116, i32 %121)
br label %173
123: ; preds = %112, %109
%124 = load i32, i32* %6
%125 = icmp eq i32 %124, 0
br i1 %125, label %126, label %140
126: ; preds = %123
%127 = load i32, i32* %8
%128 = icmp eq i32 %127, 1
br i1 %128, label %129, label %140
129: ; preds = %126
%130 = load i8*, i8** %3
%131 = load i32, i32* @S_IRUSR
%132 = icmp ne i32 %131, 0
%133 = xor i1 %132, true
%134 = zext i1 %133 to i32
%135 = load i32, i32* @S_IWUSR
%136 = or i32 %134, %135
%137 = load i32, i32* @S_IXUSR
%138 = or i32 %136, %137
%139 = call i32 @chmod(i8* %130, i32 %138)
br label %172
140: ; preds = %126, %123
%141 = load i32, i32* %6
%142 = icmp eq i32 %141, 1
br i1 %142, label %143, label %157
143: ; preds = %140
%144 = load i32, i32* %8
%145 = icmp eq i32 %144, 0
br i1 %145, label %146, label %157
146: ; preds = %143
%147 = load i8*, i8** %3
%148 = load i32, i32* @S_IRUSR
%149 = load i32, i32* @S_IWUSR
%150 = or i32 %148, %149
%151 = load i32, i32* @S_IXUSR
%152 = icmp ne i32 %151, 0
%153 = xor i1 %152, true
%154 = zext i1 %153 to i32
%155 = or i32 %150, %154
%156 = call i32 @chmod(i8* %147, i32 %155)
br label %171
157: ; preds = %143, %140
%158 = load i8*, i8** %3
%159 = load i32, i32* @S_IRUSR
%160 = icmp ne i32 %159, 0
%161 = xor i1 %160, true
%162 = zext i1 %161 to i32
%163 = load i32, i32* @S_IWUSR
%164 = or i32 %162, %163
%165 = load i32, i32* @S_IXUSR
%166 = icmp ne i32 %165, 0
%167 = xor i1 %166, true
%168 = zext i1 %167 to i32
%169 = or i32 %164, %168
%170 = call i32 @chmod(i8* %158, i32 %169)
br label %171
171: ; preds = %157, %146
br label %172
172: ; preds = %171, %129
br label %173
173: ; preds = %172, %115
br label %492
174: ; preds = %105
%175 = load i8*, i8** %4
%176 = call i64 @strcmp(i8* %175, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i64 0, i64 0))
%177 = icmp eq i64 %176, 0
br i1 %177, label %178, label %243
178: ; preds = %174
%179 = load i32, i32* %7
%180 = icmp eq i32 %179, 1
br i1 %180, label %181, label %192
181: ; preds = %178
%182 = load i32, i32* %8
%183 = icmp eq i32 %182, 1
br i1 %183, label %184, label %192
184: ; preds = %181
%185 = load i8*, i8** %3
%186 = load i32, i32* @S_IRUSR
%187 = load i32, i32* @S_IWUSR
%188 = or i32 %186, %187
%189 = load i32, i32* @S_IXUSR
%190 = or i32 %188, %189
%191 = call i32 @chmod(i8* %185, i32 %190)
br label %242
192: ; preds = %181, %178
%193 = load i32, i32* %7
%194 = icmp eq i32 %193, 0
br i1 %194, label %195, label %209
195: ; preds = %192
%196 = load i32, i32* %8
%197 = icmp eq i32 %196, 1
br i1 %197, label %198, label %209
198: ; preds = %195
%199 = load i8*, i8** %3
%200 = load i32, i32* @S_IRUSR
%201 = load i32, i32* @S_IWUSR
%202 = icmp ne i32 %201, 0
%203 = xor i1 %202, true
%204 = zext i1 %203 to i32
%205 = or i32 %200, %204
%206 = load i32, i32* @S_IXUSR
%207 = or i32 %205, %206
%208 = call i32 @chmod(i8* %199, i32 %207)
br label %241
209: ; preds = %195, %192
%210 = load i32, i32* %7
%211 = icmp eq i32 %210, 1
br i1 %211, label %212, label %226
212: ; preds = %209
%213 = load i32, i32* %8
%214 = icmp eq i32 %213, 0
br i1 %214, label %215, label %226
215: ; preds = %212
%216 = load i8*, i8** %3
%217 = load i32, i32* @S_IRUSR
%218 = load i32, i32* @S_IWUSR
%219 = or i32 %217, %218
%220 = load i32, i32* @S_IXUSR
%221 = icmp ne i32 %220, 0
%222 = xor i1 %221, true
%223 = zext i1 %222 to i32
%224 = or i32 %219, %223
%225 = call i32 @chmod(i8* %216, i32 %224)
br label %240
226: ; preds = %212, %209
%227 = load i8*, i8** %3
%228 = load i32, i32* @S_IRUSR
%229 = load i32, i32* @S_IWUSR
%230 = icmp ne i32 %229, 0
%231 = xor i1 %230, true
%232 = zext i1 %231 to i32
%233 = or i32 %228, %232
%234 = load i32, i32* @S_IXUSR
%235 = icmp ne i32 %234, 0
%236 = xor i1 %235, true
%237 = zext i1 %236 to i32
%238 = or i32 %233, %237
%239 = call i32 @chmod(i8* %227, i32 %238)
br label %240
240: ; preds = %226, %215
br label %241
241: ; preds = %240, %198
br label %242
242: ; preds = %241, %184
br label %491
243: ; preds = %174
%244 = load i8*, i8** %4
%245 = call i64 @strcmp(i8* %244, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i64 0, i64 0))
%246 = icmp eq i64 %245, 0
br i1 %246, label %247, label %324
247: ; preds = %243
%248 = load i32, i32* %6
%249 = icmp eq i32 %248, 1
br i1 %249, label %250, label %264
250: ; preds = %247
%251 = load i32, i32* %7
%252 = icmp eq i32 %251, 1
br i1 %252, label %253, label %264
253: ; preds = %250
%254 = load i8*, i8** %3
%255 = load i32, i32* @S_IRUSR
%256 = load i32, i32* @S_IWUSR
%257 = or i32 %255, %256
%258 = load i32, i32* @S_IXUSR
%259 = icmp ne i32 %258, 0
%260 = xor i1 %259, true
%261 = zext i1 %260 to i32
%262 = or i32 %257, %261
%263 = call i32 @chmod(i8* %254, i32 %262)
br label %323
264: ; preds = %250, %247
%265 = load i32, i32* %6
%266 = icmp eq i32 %265, 1
br i1 %266, label %267, label %284
267: ; preds = %264
%268 = load i32, i32* %7
%269 = icmp eq i32 %268, 0
br i1 %269, label %270, label %284
270: ; preds = %267
%271 = load i8*, i8** %3
%272 = load i32, i32* @S_IRUSR
%273 = load i32, i32* @S_IWUSR
%274 = icmp ne i32 %273, 0
%275 = xor i1 %274, true
%276 = zext i1 %275 to i32
%277 = or i32 %272, %276
%278 = load i32, i32* @S_IXUSR
%279 = icmp ne i32 %278, 0
%280 = xor i1 %279, true
%281 = zext i1 %280 to i32
%282 = or i32 %277, %281
%283 = call i32 @chmod(i8* %271, i32 %282)
br label %322
284: ; preds = %267, %264
%285 = load i32, i32* %6
%286 = icmp eq i32 %285, 0
br i1 %286, label %287, label %304
287: ; preds = %284
%288 = load i32, i32* %7
%289 = icmp eq i32 %288, 1
br i1 %289, label %290, label %304
290: ; preds = %287
%291 = load i8*, i8** %3
%292 = load i32, i32* @S_IRUSR
%293 = icmp ne i32 %292, 0
%294 = xor i1 %293, true
%295 = zext i1 %294 to i32
%296 = load i32, i32* @S_IWUSR
%297 = or i32 %295, %296
%298 = load i32, i32* @S_IXUSR
%299 = icmp ne i32 %298, 0
%300 = xor i1 %299, true
%301 = zext i1 %300 to i32
%302 = or i32 %297, %301
%303 = call i32 @chmod(i8* %291, i32 %302)
br label %321
304: ; preds = %287, %284
%305 = load i8*, i8** %3
%306 = load i32, i32* @S_IRUSR
%307 = icmp ne i32 %306, 0
%308 = xor i1 %307, true
%309 = zext i1 %308 to i32
%310 = load i32, i32* @S_IWUSR
%311 = icmp ne i32 %310, 0
%312 = xor i1 %311, true
%313 = zext i1 %312 to i32
%314 = or i32 %309, %313
%315 = load i32, i32* @S_IXUSR
%316 = icmp ne i32 %315, 0
%317 = xor i1 %316, true
%318 = zext i1 %317 to i32
%319 = or i32 %314, %318
%320 = call i32 @chmod(i8* %305, i32 %319)
br label %321
321: ; preds = %304, %290
br label %322
322: ; preds = %321, %270
br label %323
323: ; preds = %322, %253
br label %490
324: ; preds = %243
%325 = load i8*, i8** %4
%326 = call i64 @strcmp(i8* %325, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.5, i64 0, i64 0))
%327 = icmp eq i64 %326, 0
br i1 %327, label %328, label %405
328: ; preds = %324
%329 = load i32, i32* %6
%330 = icmp eq i32 %329, 1
br i1 %330, label %331, label %345
331: ; preds = %328
%332 = load i32, i32* %8
%333 = icmp eq i32 %332, 1
br i1 %333, label %334, label %345
334: ; preds = %331
%335 = load i8*, i8** %3
%336 = load i32, i32* @S_IRUSR
%337 = load i32, i32* @S_IWUSR
%338 = icmp ne i32 %337, 0
%339 = xor i1 %338, true
%340 = zext i1 %339 to i32
%341 = or i32 %336, %340
%342 = load i32, i32* @S_IXUSR
%343 = or i32 %341, %342
%344 = call i32 @chmod(i8* %335, i32 %343)
br label %404
345: ; preds = %331, %328
%346 = load i32, i32* %6
%347 = icmp eq i32 %346, 1
br i1 %347, label %348, label %365
348: ; preds = %345
%349 = load i32, i32* %8
%350 = icmp eq i32 %349, 0
br i1 %350, label %351, label %365
351: ; preds = %348
%352 = load i8*, i8** %3
%353 = load i32, i32* @S_IRUSR
%354 = load i32, i32* @S_IWUSR
%355 = icmp ne i32 %354, 0
%356 = xor i1 %355, true
%357 = zext i1 %356 to i32
%358 = or i32 %353, %357
%359 = load i32, i32* @S_IXUSR
%360 = icmp ne i32 %359, 0
%361 = xor i1 %360, true
%362 = zext i1 %361 to i32
%363 = or i32 %358, %362
%364 = call i32 @chmod(i8* %352, i32 %363)
br label %403
365: ; preds = %348, %345
%366 = load i32, i32* %6
%367 = icmp eq i32 %366, 0
br i1 %367, label %368, label %385
368: ; preds = %365
%369 = load i32, i32* %8
%370 = icmp eq i32 %369, 1
br i1 %370, label %371, label %385
371: ; preds = %368
%372 = load i8*, i8** %3
%373 = load i32, i32* @S_IRUSR
%374 = icmp ne i32 %373, 0
%375 = xor i1 %374, true
%376 = zext i1 %375 to i32
%377 = load i32, i32* @S_IWUSR
%378 = icmp ne i32 %377, 0
%379 = xor i1 %378, true
%380 = zext i1 %379 to i32
%381 = or i32 %376, %380
%382 = load i32, i32* @S_IXUSR
%383 = or i32 %381, %382
%384 = call i32 @chmod(i8* %372, i32 %383)
br label %402
385: ; preds = %368, %365
%386 = load i8*, i8** %3
%387 = load i32, i32* @S_IRUSR
%388 = icmp ne i32 %387, 0
%389 = xor i1 %388, true
%390 = zext i1 %389 to i32
%391 = load i32, i32* @S_IWUSR
%392 = icmp ne i32 %391, 0
%393 = xor i1 %392, true
%394 = zext i1 %393 to i32
%395 = or i32 %390, %394
%396 = load i32, i32* @S_IXUSR
%397 = icmp ne i32 %396, 0
%398 = xor i1 %397, true
%399 = zext i1 %398 to i32
%400 = or i32 %395, %399
%401 = call i32 @chmod(i8* %386, i32 %400)
br label %402
402: ; preds = %385, %371
br label %403
403: ; preds = %402, %351
br label %404
404: ; preds = %403, %334
br label %489
405: ; preds = %324
%406 = load i8*, i8** %4
%407 = call i64 @strcmp(i8* %406, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.6, i64 0, i64 0))
%408 = icmp eq i64 %407, 0
br i1 %408, label %409, label %486
409: ; preds = %405
%410 = load i32, i32* %7
%411 = icmp eq i32 %410, 1
br i1 %411, label %412, label %426
412: ; preds = %409
%413 = load i32, i32* %8
%414 = icmp eq i32 %413, 1
br i1 %414, label %415, label %426
415: ; preds = %412
%416 = load i8*, i8** %3
%417 = load i32, i32* @S_IRUSR
%418 = icmp ne i32 %417, 0
%419 = xor i1 %418, true
%420 = zext i1 %419 to i32
%421 = load i32, i32* @S_IWUSR
%422 = or i32 %420, %421
%423 = load i32, i32* @S_IXUSR
%424 = or i32 %422, %423
%425 = call i32 @chmod(i8* %416, i32 %424)
br label %485
426: ; preds = %412, %409
%427 = load i32, i32* %7
%428 = icmp eq i32 %427, 0
br i1 %428, label %429, label %446
429: ; preds = %426
%430 = load i32, i32* %8
%431 = icmp eq i32 %430, 1
br i1 %431, label %432, label %446
432: ; preds = %429
%433 = load i8*, i8** %3
%434 = load i32, i32* @S_IRUSR
%435 = icmp ne i32 %434, 0
%436 = xor i1 %435, true
%437 = zext i1 %436 to i32
%438 = load i32, i32* @S_IWUSR
%439 = icmp ne i32 %438, 0
%440 = xor i1 %439, true
%441 = zext i1 %440 to i32
%442 = or i32 %437, %441
%443 = load i32, i32* @S_IXUSR
%444 = or i32 %442, %443
%445 = call i32 @chmod(i8* %433, i32 %444)
br label %484
446: ; preds = %429, %426
%447 = load i32, i32* %7
%448 = icmp eq i32 %447, 1
br i1 %448, label %449, label %466
449: ; preds = %446
%450 = load i32, i32* %8
%451 = icmp eq i32 %450, 0
br i1 %451, label %452, label %466
452: ; preds = %449
%453 = load i8*, i8** %3
%454 = load i32, i32* @S_IRUSR
%455 = icmp ne i32 %454, 0
%456 = xor i1 %455, true
%457 = zext i1 %456 to i32
%458 = load i32, i32* @S_IWUSR
%459 = or i32 %457, %458
%460 = load i32, i32* @S_IXUSR
%461 = icmp ne i32 %460, 0
%462 = xor i1 %461, true
%463 = zext i1 %462 to i32
%464 = or i32 %459, %463
%465 = call i32 @chmod(i8* %453, i32 %464)
br label %483
466: ; preds = %449, %446
%467 = load i8*, i8** %3
%468 = load i32, i32* @S_IRUSR
%469 = icmp ne i32 %468, 0
%470 = xor i1 %469, true
%471 = zext i1 %470 to i32
%472 = load i32, i32* @S_IWUSR
%473 = icmp ne i32 %472, 0
%474 = xor i1 %473, true
%475 = zext i1 %474 to i32
%476 = or i32 %471, %475
%477 = load i32, i32* @S_IXUSR
%478 = icmp ne i32 %477, 0
%479 = xor i1 %478, true
%480 = zext i1 %479 to i32
%481 = or i32 %476, %480
%482 = call i32 @chmod(i8* %467, i32 %481)
br label %483
483: ; preds = %466, %452
br label %484
484: ; preds = %483, %432
br label %485
485: ; preds = %484, %415
br label %488
486: ; preds = %405
%487 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.7, i64 0, i64 0))
br label %488
488: ; preds = %486, %485
br label %489
489: ; preds = %488, %404
br label %490
490: ; preds = %489, %323
br label %491
491: ; preds = %490, %242
br label %492
492: ; preds = %491, %173
br label %493
493: ; preds = %12, %492, %104
ret void
}

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