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

/* Forward declarations */

/* Type definitions */
typedef int mode_t;

/* Variables and functions */
int S_IRGRP;
int S_IROTH;
int S_IRUSR;
int S_ISGID;
int S_ISUID;
int S_ISVTX;
int S_IWGRP;
int S_IWOTH;
int S_IWUSR;
int S_IXGRP;
int S_IXOTH;
int S_IXUSR;
int file_perm_oct(mode_t perm) {
  int oct_perm = 00;
  (perm & S_ISUID) ? (oct_perm += 04000) : (oct_perm += 00);
  (perm & S_ISGID) ? (oct_perm += 02000) : (oct_perm += 00);
  (perm & S_ISVTX) ? (oct_perm += 01000) : (oct_perm += 00);
  (perm & S_IRUSR) ? (oct_perm += 0400) : (oct_perm += 00);
  (perm & S_IWUSR) ? (oct_perm += 0200) : (oct_perm += 00);
  (perm & S_IXUSR) ? (oct_perm += 0100) : (oct_perm += 00);
  (perm & S_IRGRP) ? (oct_perm += 040) : (oct_perm += 00);
  (perm & S_IWGRP) ? (oct_perm += 020) : (oct_perm += 00);
  (perm & S_IXGRP) ? (oct_perm += 010) : (oct_perm += 00);
  (perm & S_IROTH) ? (oct_perm += 04) : (oct_perm += 00);
  (perm & S_IWOTH) ? (oct_perm += 02) : (oct_perm += 00);
  (perm & S_IXOTH) ? (oct_perm += 01) : (oct_perm += 00);
  return oct_perm;
}


x86 assembly (clang, -O0):
<file_perm_oct>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2eb8(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1133 <file_perm_oct+0x33>
mov    -0x8(%rbp),%eax
add    $0x800,%eax
mov    %eax,-0x8(%rbp)
jmp    113c <file_perm_oct+0x3c>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2e62(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1161 <file_perm_oct+0x61>
mov    -0x8(%rbp),%eax
add    $0x400,%eax
mov    %eax,-0x8(%rbp)
jmp    116a <file_perm_oct+0x6a>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2e74(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     118f <file_perm_oct+0x8f>
mov    -0x8(%rbp),%eax
add    $0x200,%eax
mov    %eax,-0x8(%rbp)
jmp    1198 <file_perm_oct+0x98>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2dee(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     11bd <file_perm_oct+0xbd>
mov    -0x8(%rbp),%eax
add    $0x100,%eax
mov    %eax,-0x8(%rbp)
jmp    11c6 <file_perm_oct+0xc6>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2df0(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     11eb <file_perm_oct+0xeb>
mov    -0x8(%rbp),%eax
add    $0x80,%eax
mov    %eax,-0x8(%rbp)
jmp    11f4 <file_perm_oct+0xf4>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2dda(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1217 <file_perm_oct+0x117>
mov    -0x8(%rbp),%eax
add    $0x40,%eax
mov    %eax,-0x8(%rbp)
jmp    1220 <file_perm_oct+0x120>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2d76(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     1243 <file_perm_oct+0x143>
mov    -0x8(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x8(%rbp)
jmp    124c <file_perm_oct+0x14c>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2d72(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     126f <file_perm_oct+0x16f>
mov    -0x8(%rbp),%eax
add    $0x10,%eax
mov    %eax,-0x8(%rbp)
jmp    1278 <file_perm_oct+0x178>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2d36(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     129b <file_perm_oct+0x19b>
mov    -0x8(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x8(%rbp)
jmp    12a4 <file_perm_oct+0x1a4>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2cea(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     12c7 <file_perm_oct+0x1c7>
mov    -0x8(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x8(%rbp)
jmp    12d0 <file_perm_oct+0x1d0>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2ca6(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     12f3 <file_perm_oct+0x1f3>
mov    -0x8(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x8(%rbp)
jmp    12fc <file_perm_oct+0x1fc>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    0x2cda(%rip),%rcx
and    (%rcx),%eax
cmp    $0x0,%eax
je     131f <file_perm_oct+0x21f>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1328 <file_perm_oct+0x228>
mov    -0x8(%rbp),%eax
add    $0x0,%eax
mov    %eax,-0x8(%rbp)
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<file_perm_oct>:
mov    0x2ec9(%rip),%rax
xor    %ecx,%ecx
test   %edi,(%rax)
setne  %cl
shl    $0xb,%ecx
mov    0x2e90(%rip),%rax
lea    0x400(%rcx),%edx
test   %edi,(%rax)
cmove  %ecx,%edx
mov    0x2ebe(%rip),%rax
lea    0x200(%rdx),%ecx
test   %edi,(%rax)
cmove  %edx,%ecx
mov    0x2e54(%rip),%rax
lea    0x100(%rcx),%edx
test   %edi,(%rax)
cmove  %ecx,%edx
mov    0x2e72(%rip),%rax
lea    0x80(%rdx),%ecx
test   %edi,(%rax)
cmove  %edx,%ecx
mov    0x2e78(%rip),%rax
lea    0x40(%rcx),%edx
test   %edi,(%rax)
cmove  %ecx,%edx
mov    0x2e31(%rip),%rax
lea    0x20(%rdx),%ecx
test   %edi,(%rax)
cmove  %edx,%ecx
mov    0x2e4a(%rip),%rax
lea    0x10(%rcx),%edx
test   %edi,(%rax)
cmove  %ecx,%edx
mov    0x2e2b(%rip),%rax
lea    0x8(%rdx),%ecx
test   %edi,(%rax)
cmove  %edx,%ecx
mov    0x2dfc(%rip),%rax
lea    0x4(%rcx),%edx
test   %edi,(%rax)
cmove  %ecx,%edx
mov    0x2dd5(%rip),%rcx
lea    0x2(%rdx),%eax
test   %edi,(%rcx)
cmove  %edx,%eax
mov    0x2e26(%rip),%rcx
and    (%rcx),%edi
cmp    $0x1,%edi
sbb    $0xffffffff,%eax
ret

LLVM IR (-O0):
@S_ISUID = global i32 0
@S_ISGID = global i32 0
@S_ISVTX = global i32 0
@S_IRUSR = global i32 0
@S_IWUSR = global i32 0
@S_IXUSR = global i32 0
@S_IRGRP = global i32 0
@S_IWGRP = global i32 0
@S_IXGRP = global i32 0
@S_IROTH = global i32 0
@S_IWOTH = global i32 0
@S_IXOTH = global i32 0
define i32 @file_perm_oct(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
store i32 0, i32* %3
%4 = load i32, i32* %2
%5 = load i32, i32* @S_ISUID
%6 = and i32 %4, %5
%7 = icmp ne i32 %6, 0
br i1 %7, label %8, label %11
8: ; preds = %1
%9 = load i32, i32* %3
%10 = add nsw i32 %9, 2048
store i32 %10, i32* %3
br label %14
11: ; preds = %1
%12 = load i32, i32* %3
%13 = add nsw i32 %12, 0
store i32 %13, i32* %3
br label %14
14: ; preds = %11, %8
%15 = phi i32 [ %10, %8 ], [ %13, %11 ]
%16 = load i32, i32* %2
%17 = load i32, i32* @S_ISGID
%18 = and i32 %16, %17
%19 = icmp ne i32 %18, 0
br i1 %19, label %20, label %23
20: ; preds = %14
%21 = load i32, i32* %3
%22 = add nsw i32 %21, 1024
store i32 %22, i32* %3
br label %26
23: ; preds = %14
%24 = load i32, i32* %3
%25 = add nsw i32 %24, 0
store i32 %25, i32* %3
br label %26
26: ; preds = %23, %20
%27 = phi i32 [ %22, %20 ], [ %25, %23 ]
%28 = load i32, i32* %2
%29 = load i32, i32* @S_ISVTX
%30 = and i32 %28, %29
%31 = icmp ne i32 %30, 0
br i1 %31, label %32, label %35
32: ; preds = %26
%33 = load i32, i32* %3
%34 = add nsw i32 %33, 512
store i32 %34, i32* %3
br label %38
35: ; preds = %26
%36 = load i32, i32* %3
%37 = add nsw i32 %36, 0
store i32 %37, i32* %3
br label %38
38: ; preds = %35, %32
%39 = phi i32 [ %34, %32 ], [ %37, %35 ]
%40 = load i32, i32* %2
%41 = load i32, i32* @S_IRUSR
%42 = and i32 %40, %41
%43 = icmp ne i32 %42, 0
br i1 %43, label %44, label %47
44: ; preds = %38
%45 = load i32, i32* %3
%46 = add nsw i32 %45, 256
store i32 %46, i32* %3
br label %50
47: ; preds = %38
%48 = load i32, i32* %3
%49 = add nsw i32 %48, 0
store i32 %49, i32* %3
br label %50
50: ; preds = %47, %44
%51 = phi i32 [ %46, %44 ], [ %49, %47 ]
%52 = load i32, i32* %2
%53 = load i32, i32* @S_IWUSR
%54 = and i32 %52, %53
%55 = icmp ne i32 %54, 0
br i1 %55, label %56, label %59
56: ; preds = %50
%57 = load i32, i32* %3
%58 = add nsw i32 %57, 128
store i32 %58, i32* %3
br label %62
59: ; preds = %50
%60 = load i32, i32* %3
%61 = add nsw i32 %60, 0
store i32 %61, i32* %3
br label %62
62: ; preds = %59, %56
%63 = phi i32 [ %58, %56 ], [ %61, %59 ]
%64 = load i32, i32* %2
%65 = load i32, i32* @S_IXUSR
%66 = and i32 %64, %65
%67 = icmp ne i32 %66, 0
br i1 %67, label %68, label %71
68: ; preds = %62
%69 = load i32, i32* %3
%70 = add nsw i32 %69, 64
store i32 %70, i32* %3
br label %74
71: ; preds = %62
%72 = load i32, i32* %3
%73 = add nsw i32 %72, 0
store i32 %73, i32* %3
br label %74
74: ; preds = %71, %68
%75 = phi i32 [ %70, %68 ], [ %73, %71 ]
%76 = load i32, i32* %2
%77 = load i32, i32* @S_IRGRP
%78 = and i32 %76, %77
%79 = icmp ne i32 %78, 0
br i1 %79, label %80, label %83
80: ; preds = %74
%81 = load i32, i32* %3
%82 = add nsw i32 %81, 32
store i32 %82, i32* %3
br label %86
83: ; preds = %74
%84 = load i32, i32* %3
%85 = add nsw i32 %84, 0
store i32 %85, i32* %3
br label %86
86: ; preds = %83, %80
%87 = phi i32 [ %82, %80 ], [ %85, %83 ]
%88 = load i32, i32* %2
%89 = load i32, i32* @S_IWGRP
%90 = and i32 %88, %89
%91 = icmp ne i32 %90, 0
br i1 %91, label %92, label %95
92: ; preds = %86
%93 = load i32, i32* %3
%94 = add nsw i32 %93, 16
store i32 %94, i32* %3
br label %98
95: ; preds = %86
%96 = load i32, i32* %3
%97 = add nsw i32 %96, 0
store i32 %97, i32* %3
br label %98
98: ; preds = %95, %92
%99 = phi i32 [ %94, %92 ], [ %97, %95 ]
%100 = load i32, i32* %2
%101 = load i32, i32* @S_IXGRP
%102 = and i32 %100, %101
%103 = icmp ne i32 %102, 0
br i1 %103, label %104, label %107
104: ; preds = %98
%105 = load i32, i32* %3
%106 = add nsw i32 %105, 8
store i32 %106, i32* %3
br label %110
107: ; preds = %98
%108 = load i32, i32* %3
%109 = add nsw i32 %108, 0
store i32 %109, i32* %3
br label %110
110: ; preds = %107, %104
%111 = phi i32 [ %106, %104 ], [ %109, %107 ]
%112 = load i32, i32* %2
%113 = load i32, i32* @S_IROTH
%114 = and i32 %112, %113
%115 = icmp ne i32 %114, 0
br i1 %115, label %116, label %119
116: ; preds = %110
%117 = load i32, i32* %3
%118 = add nsw i32 %117, 4
store i32 %118, i32* %3
br label %122
119: ; preds = %110
%120 = load i32, i32* %3
%121 = add nsw i32 %120, 0
store i32 %121, i32* %3
br label %122
122: ; preds = %119, %116
%123 = phi i32 [ %118, %116 ], [ %121, %119 ]
%124 = load i32, i32* %2
%125 = load i32, i32* @S_IWOTH
%126 = and i32 %124, %125
%127 = icmp ne i32 %126, 0
br i1 %127, label %128, label %131
128: ; preds = %122
%129 = load i32, i32* %3
%130 = add nsw i32 %129, 2
store i32 %130, i32* %3
br label %134
131: ; preds = %122
%132 = load i32, i32* %3
%133 = add nsw i32 %132, 0
store i32 %133, i32* %3
br label %134
134: ; preds = %131, %128
%135 = phi i32 [ %130, %128 ], [ %133, %131 ]
%136 = load i32, i32* %2
%137 = load i32, i32* @S_IXOTH
%138 = and i32 %136, %137
%139 = icmp ne i32 %138, 0
br i1 %139, label %140, label %143
140: ; preds = %134
%141 = load i32, i32* %3
%142 = add nsw i32 %141, 1
store i32 %142, i32* %3
br label %146
143: ; preds = %134
%144 = load i32, i32* %3
%145 = add nsw i32 %144, 0
store i32 %145, i32* %3
br label %146
146: ; preds = %143, %140
%147 = phi i32 [ %142, %140 ], [ %145, %143 ]
%148 = load i32, i32* %3
ret i32 %148
}

LLVM IR (-O2):
@S_ISUID = global i32 0
@S_ISGID = global i32 0
@S_ISVTX = global i32 0
@S_IRUSR = global i32 0
@S_IWUSR = global i32 0
@S_IXUSR = global i32 0
@S_IRGRP = global i32 0
@S_IWGRP = global i32 0
@S_IXGRP = global i32 0
@S_IROTH = global i32 0
@S_IWOTH = global i32 0
@S_IXOTH = global i32 0
define i32 @file_perm_oct(i32 %0) {
%2 = load i32, i32* @S_ISUID
%3 = and i32 %2, %0
%4 = icmp eq i32 %3, 0
%5 = select i1 %4, i32 0, i32 2048
%6 = load i32, i32* @S_ISGID
%7 = and i32 %6, %0
%8 = icmp eq i32 %7, 0
%9 = or i32 %5, 1024
%10 = select i1 %8, i32 %5, i32 %9
%11 = load i32, i32* @S_ISVTX
%12 = and i32 %11, %0
%13 = icmp eq i32 %12, 0
%14 = or i32 %10, 512
%15 = select i1 %13, i32 %10, i32 %14
%16 = load i32, i32* @S_IRUSR
%17 = and i32 %16, %0
%18 = icmp eq i32 %17, 0
%19 = or i32 %15, 256
%20 = select i1 %18, i32 %15, i32 %19
%21 = load i32, i32* @S_IWUSR
%22 = and i32 %21, %0
%23 = icmp eq i32 %22, 0
%24 = add nsw i32 %20, 128
%25 = select i1 %23, i32 %20, i32 %24
%26 = load i32, i32* @S_IXUSR
%27 = and i32 %26, %0
%28 = icmp eq i32 %27, 0
%29 = add nsw i32 %25, 64
%30 = select i1 %28, i32 %25, i32 %29
%31 = load i32, i32* @S_IRGRP
%32 = and i32 %31, %0
%33 = icmp eq i32 %32, 0
%34 = add nsw i32 %30, 32
%35 = select i1 %33, i32 %30, i32 %34
%36 = load i32, i32* @S_IWGRP
%37 = and i32 %36, %0
%38 = icmp eq i32 %37, 0
%39 = add nsw i32 %35, 16
%40 = select i1 %38, i32 %35, i32 %39
%41 = load i32, i32* @S_IXGRP
%42 = and i32 %41, %0
%43 = icmp eq i32 %42, 0
%44 = add nsw i32 %40, 8
%45 = select i1 %43, i32 %40, i32 %44
%46 = load i32, i32* @S_IROTH
%47 = and i32 %46, %0
%48 = icmp eq i32 %47, 0
%49 = add nsw i32 %45, 4
%50 = select i1 %48, i32 %45, i32 %49
%51 = load i32, i32* @S_IWOTH
%52 = and i32 %51, %0
%53 = icmp eq i32 %52, 0
%54 = add nsw i32 %50, 2
%55 = select i1 %53, i32 %50, i32 %54
%56 = load i32, i32* @S_IXOTH
%57 = and i32 %56, %0
%58 = icmp ne i32 %57, 0
%59 = zext i1 %58 to i32
%60 = add nsw i32 %55, %59
ret i32 %60
}