#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;
scalar_t__ S_ISBLK(int);
scalar_t__ S_ISCHR(int);
scalar_t__ S_ISDIR(int);
scalar_t__ S_ISFIFO(int);
scalar_t__ S_ISLNK(int);
scalar_t__ S_ISSOCK(int);
int S_IWGRP;
int S_IWOTH;
int S_IWUSR;
int S_IXGRP;
int S_IXOTH;
int S_IXUSR;
char *modestr(mode_t mode_bits, char *mode_str) {
  if (S_ISBLK(mode_bits))
    mode_str[0] = 'b';
  else if (S_ISCHR(mode_bits))
    mode_str[0] = 'c';
  else if (S_ISDIR(mode_bits))
    mode_str[0] = 'd';
  else if (S_ISLNK(mode_bits))
    mode_str[0] = 'l';
  else if (S_ISFIFO(mode_bits))
    mode_str[0] = 'p';
  else if (S_ISSOCK(mode_bits))
    mode_str[0] = 's';
  else
    mode_str[0] = '-';
  mode_str[1] = S_IRUSR & mode_bits ? 'r' : '-';
  mode_str[2] = S_IWUSR & mode_bits ? 'w' : '-';
  mode_str[3] = S_IXUSR & mode_bits ? 'x' : '-';
  mode_str[4] = S_IRGRP & mode_bits ? 'r' : '-';
  mode_str[5] = S_IWGRP & mode_bits ? 'w' : '-';
  mode_str[6] = S_IXGRP & mode_bits ? 'x' : '-';
  mode_str[7] = S_IROTH & mode_bits ? 'r' : '-';
  mode_str[8] = S_IWOTH & mode_bits ? 'w' : '-';
  mode_str[9] = S_IXOTH & mode_bits ? 'x' : '-';
  mode_str[10] = '\0';
  return mode_str;
}


x86 assembly (clang, -O0):
<modestr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x4(%rbp),%edi
call   1080 <S_ISBLK@plt>
cmp    $0x0,%rax
je     118d <modestr+0x2d>
mov    -0x10(%rbp),%rax
movb   $0x62,(%rax)
jmp    1243 <modestr+0xe3>
mov    -0x4(%rbp),%edi
call   1070 <S_ISCHR@plt>
cmp    $0x0,%rax
je     11ab <modestr+0x4b>
mov    -0x10(%rbp),%rax
movb   $0x63,(%rax)
jmp    123e <modestr+0xde>
mov    -0x4(%rbp),%edi
call   1060 <S_ISDIR@plt>
cmp    $0x0,%rax
je     11c9 <modestr+0x69>
mov    -0x10(%rbp),%rax
movb   $0x64,(%rax)
jmp    1239 <modestr+0xd9>
mov    -0x4(%rbp),%edi
call   1030 <S_ISLNK@plt>
cmp    $0x0,%rax
je     11e7 <modestr+0x87>
mov    -0x10(%rbp),%rax
movb   $0x6c,(%rax)
jmp    1234 <modestr+0xd4>
mov    -0x4(%rbp),%edi
call   1040 <S_ISFIFO@plt>
cmp    $0x0,%rax
je     1205 <modestr+0xa5>
mov    -0x10(%rbp),%rax
movb   $0x70,(%rax)
jmp    122f <modestr+0xcf>
mov    -0x4(%rbp),%edi
call   1050 <S_ISSOCK@plt>
cmp    $0x0,%rax
je     1223 <modestr+0xc3>
mov    -0x10(%rbp),%rax
movb   $0x73,(%rax)
jmp    122a <modestr+0xca>
mov    -0x10(%rbp),%rax
movb   $0x2d,(%rax)
jmp    122f <modestr+0xcf>
jmp    1234 <modestr+0xd4>
jmp    1239 <modestr+0xd9>
jmp    123e <modestr+0xde>
jmp    1243 <modestr+0xe3>
mov    0x2d5e(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x72,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x1(%rax)
mov    0x2d61(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x77,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x2(%rax)
mov    0x2d4c(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x78,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x3(%rax)
mov    0x2cff(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x72,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x4(%rax)
mov    0x2cfa(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x77,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x5(%rax)
mov    0x2cc5(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x78,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x6(%rax)
mov    0x2c88(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x72,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x7(%rax)
mov    0x2c4b(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x77,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x8(%rax)
mov    0x2c76(%rip),%rax
mov    (%rax),%edx
and    -0x4(%rbp),%edx
mov    $0x2d,%eax
mov    $0x78,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,0x9(%rax)
mov    -0x10(%rbp),%rax
movb   $0x0,0xa(%rax)
mov    -0x10(%rbp),%rax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<modestr>:
push   %rbp
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %edi,%ebp
call   1080 <S_ISBLK@plt>
mov    $0x62,%cl
test   %rax,%rax
jne    11c3 <modestr+0x63>
mov    %ebp,%edi
call   1070 <S_ISCHR@plt>
mov    $0x63,%cl
test   %rax,%rax
jne    11c3 <modestr+0x63>
mov    %ebp,%edi
call   1060 <S_ISDIR@plt>
mov    $0x64,%cl
test   %rax,%rax
jne    11c3 <modestr+0x63>
mov    %ebp,%edi
call   1030 <S_ISLNK@plt>
mov    $0x6c,%cl
test   %rax,%rax
jne    11c3 <modestr+0x63>
mov    %ebp,%edi
call   1040 <S_ISFIFO@plt>
mov    $0x70,%cl
test   %rax,%rax
jne    11c3 <modestr+0x63>
mov    %ebp,%edi
call   1050 <S_ISSOCK@plt>
test   %rax,%rax
mov    $0x2d,%eax
mov    $0x73,%ecx
cmove  %eax,%ecx
mov    %cl,(%rbx)
mov    0x2ddc(%rip),%rax
mov    (%rax),%eax
and    %ebp,%eax
mov    $0x2d,%eax
mov    $0x72,%ecx
cmove  %eax,%ecx
mov    %cl,0x1(%rbx)
mov    0x2de9(%rip),%rcx
mov    (%rcx),%ecx
and    %ebp,%ecx
mov    $0x77,%ecx
cmove  %eax,%ecx
mov    %cl,0x2(%rbx)
mov    0x2de3(%rip),%rcx
mov    (%rcx),%ecx
and    %ebp,%ecx
mov    $0x78,%edx
cmove  %eax,%edx
mov    $0x72,%ecx
mov    %dl,0x3(%rbx)
mov    0x2da0(%rip),%rdx
mov    (%rdx),%edx
and    %ebp,%edx
mov    $0x72,%esi
cmove  %eax,%esi
mov    $0x77,%edx
mov    %sil,0x4(%rbx)
mov    0x2da4(%rip),%rsi
mov    (%rsi),%esi
and    %ebp,%esi
mov    $0x77,%edi
cmove  %eax,%edi
mov    $0x78,%esi
mov    %dil,0x5(%rbx)
mov    0x2d78(%rip),%rdi
mov    (%rdi),%edi
and    %ebp,%edi
mov    $0x78,%edi
cmove  %eax,%edi
mov    %dil,0x6(%rbx)
mov    0x2d49(%rip),%rdi
mov    (%rdi),%edi
and    %ebp,%edi
cmove  %eax,%ecx
mov    %cl,0x7(%rbx)
mov    0x2d20(%rip),%rcx
mov    (%rcx),%ecx
and    %ebp,%ecx
cmove  %eax,%edx
mov    %dl,0x8(%rbx)
mov    0x2d5f(%rip),%rcx
and    (%rcx),%ebp
cmove  %eax,%esi
mov    %sil,0x9(%rbx)
movb   $0x0,0xa(%rbx)
mov    %rbx,%rax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
@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 i8* @modestr(i32 %0, i8* %1) {
%3 = alloca i32
%4 = alloca i8*
store i32 %0, i32* %3
store i8* %1, i8** %4
%5 = load i32, i32* %3
%6 = call i64 @S_ISBLK(i32 %5)
%7 = icmp ne i64 %6, 0
br i1 %7, label %8, label %11
8: ; preds = %2
%9 = load i8*, i8** %4
%10 = getelementptr inbounds i8, i8* %9, i64 0
store i8 98, i8* %10
br label %54
11: ; preds = %2
%12 = load i32, i32* %3
%13 = call i64 @S_ISCHR(i32 %12)
%14 = icmp ne i64 %13, 0
br i1 %14, label %15, label %18
15: ; preds = %11
%16 = load i8*, i8** %4
%17 = getelementptr inbounds i8, i8* %16, i64 0
store i8 99, i8* %17
br label %53
18: ; preds = %11
%19 = load i32, i32* %3
%20 = call i64 @S_ISDIR(i32 %19)
%21 = icmp ne i64 %20, 0
br i1 %21, label %22, label %25
22: ; preds = %18
%23 = load i8*, i8** %4
%24 = getelementptr inbounds i8, i8* %23, i64 0
store i8 100, i8* %24
br label %52
25: ; preds = %18
%26 = load i32, i32* %3
%27 = call i64 @S_ISLNK(i32 %26)
%28 = icmp ne i64 %27, 0
br i1 %28, label %29, label %32
29: ; preds = %25
%30 = load i8*, i8** %4
%31 = getelementptr inbounds i8, i8* %30, i64 0
store i8 108, i8* %31
br label %51
32: ; preds = %25
%33 = load i32, i32* %3
%34 = call i64 @S_ISFIFO(i32 %33)
%35 = icmp ne i64 %34, 0
br i1 %35, label %36, label %39
36: ; preds = %32
%37 = load i8*, i8** %4
%38 = getelementptr inbounds i8, i8* %37, i64 0
store i8 112, i8* %38
br label %50
39: ; preds = %32
%40 = load i32, i32* %3
%41 = call i64 @S_ISSOCK(i32 %40)
%42 = icmp ne i64 %41, 0
br i1 %42, label %43, label %46
43: ; preds = %39
%44 = load i8*, i8** %4
%45 = getelementptr inbounds i8, i8* %44, i64 0
store i8 115, i8* %45
br label %49
46: ; preds = %39
%47 = load i8*, i8** %4
%48 = getelementptr inbounds i8, i8* %47, i64 0
store i8 45, i8* %48
br label %49
49: ; preds = %46, %43
br label %50
50: ; preds = %49, %36
br label %51
51: ; preds = %50, %29
br label %52
52: ; preds = %51, %22
br label %53
53: ; preds = %52, %15
br label %54
54: ; preds = %53, %8
%55 = load i32, i32* @S_IRUSR
%56 = load i32, i32* %3
%57 = and i32 %55, %56
%58 = icmp ne i32 %57, 0
%59 = zext i1 %58 to i64
%60 = select i1 %58, i32 114, i32 45
%61 = trunc i32 %60 to i8
%62 = load i8*, i8** %4
%63 = getelementptr inbounds i8, i8* %62, i64 1
store i8 %61, i8* %63
%64 = load i32, i32* @S_IWUSR
%65 = load i32, i32* %3
%66 = and i32 %64, %65
%67 = icmp ne i32 %66, 0
%68 = zext i1 %67 to i64
%69 = select i1 %67, i32 119, i32 45
%70 = trunc i32 %69 to i8
%71 = load i8*, i8** %4
%72 = getelementptr inbounds i8, i8* %71, i64 2
store i8 %70, i8* %72
%73 = load i32, i32* @S_IXUSR
%74 = load i32, i32* %3
%75 = and i32 %73, %74
%76 = icmp ne i32 %75, 0
%77 = zext i1 %76 to i64
%78 = select i1 %76, i32 120, i32 45
%79 = trunc i32 %78 to i8
%80 = load i8*, i8** %4
%81 = getelementptr inbounds i8, i8* %80, i64 3
store i8 %79, i8* %81
%82 = load i32, i32* @S_IRGRP
%83 = load i32, i32* %3
%84 = and i32 %82, %83
%85 = icmp ne i32 %84, 0
%86 = zext i1 %85 to i64
%87 = select i1 %85, i32 114, i32 45
%88 = trunc i32 %87 to i8
%89 = load i8*, i8** %4
%90 = getelementptr inbounds i8, i8* %89, i64 4
store i8 %88, i8* %90
%91 = load i32, i32* @S_IWGRP
%92 = load i32, i32* %3
%93 = and i32 %91, %92
%94 = icmp ne i32 %93, 0
%95 = zext i1 %94 to i64
%96 = select i1 %94, i32 119, i32 45
%97 = trunc i32 %96 to i8
%98 = load i8*, i8** %4
%99 = getelementptr inbounds i8, i8* %98, i64 5
store i8 %97, i8* %99
%100 = load i32, i32* @S_IXGRP
%101 = load i32, i32* %3
%102 = and i32 %100, %101
%103 = icmp ne i32 %102, 0
%104 = zext i1 %103 to i64
%105 = select i1 %103, i32 120, i32 45
%106 = trunc i32 %105 to i8
%107 = load i8*, i8** %4
%108 = getelementptr inbounds i8, i8* %107, i64 6
store i8 %106, i8* %108
%109 = load i32, i32* @S_IROTH
%110 = load i32, i32* %3
%111 = and i32 %109, %110
%112 = icmp ne i32 %111, 0
%113 = zext i1 %112 to i64
%114 = select i1 %112, i32 114, i32 45
%115 = trunc i32 %114 to i8
%116 = load i8*, i8** %4
%117 = getelementptr inbounds i8, i8* %116, i64 7
store i8 %115, i8* %117
%118 = load i32, i32* @S_IWOTH
%119 = load i32, i32* %3
%120 = and i32 %118, %119
%121 = icmp ne i32 %120, 0
%122 = zext i1 %121 to i64
%123 = select i1 %121, i32 119, i32 45
%124 = trunc i32 %123 to i8
%125 = load i8*, i8** %4
%126 = getelementptr inbounds i8, i8* %125, i64 8
store i8 %124, i8* %126
%127 = load i32, i32* @S_IXOTH
%128 = load i32, i32* %3
%129 = and i32 %127, %128
%130 = icmp ne i32 %129, 0
%131 = zext i1 %130 to i64
%132 = select i1 %130, i32 120, i32 45
%133 = trunc i32 %132 to i8
%134 = load i8*, i8** %4
%135 = getelementptr inbounds i8, i8* %134, i64 9
store i8 %133, i8* %135
%136 = load i8*, i8** %4
%137 = getelementptr inbounds i8, i8* %136, i64 10
store i8 0, i8* %137
%138 = load i8*, i8** %4
ret i8* %138
}

LLVM IR (-O2):
@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 i8* @modestr(i32 %0, i8* returned writeonly %1) {
%3 = tail call i64 @S_ISBLK(i32 %0)
%4 = icmp eq i64 %3, 0
br i1 %4, label %5, label %21
5: ; preds = %2
%6 = tail call i64 @S_ISCHR(i32 %0)
%7 = icmp eq i64 %6, 0
br i1 %7, label %8, label %21
8: ; preds = %5
%9 = tail call i64 @S_ISDIR(i32 %0)
%10 = icmp eq i64 %9, 0
br i1 %10, label %11, label %21
11: ; preds = %8
%12 = tail call i64 @S_ISLNK(i32 %0)
%13 = icmp eq i64 %12, 0
br i1 %13, label %14, label %21
14: ; preds = %11
%15 = tail call i64 @S_ISFIFO(i32 %0)
%16 = icmp eq i64 %15, 0
br i1 %16, label %17, label %21
17: ; preds = %14
%18 = tail call i64 @S_ISSOCK(i32 %0)
%19 = icmp eq i64 %18, 0
%20 = select i1 %19, i8 45, i8 115
br label %21
21: ; preds = %17, %14, %11, %8, %5, %2
%22 = phi i8 [ 98, %2 ], [ 99, %5 ], [ 100, %8 ], [ 108, %11 ], [ 112, %14 ], [ %20, %17 ]
store i8 %22, i8* %1
%23 = load i32, i32* @S_IRUSR
%24 = and i32 %23, %0
%25 = icmp eq i32 %24, 0
%26 = select i1 %25, i8 45, i8 114
%27 = getelementptr inbounds i8, i8* %1, i64 1
store i8 %26, i8* %27
%28 = load i32, i32* @S_IWUSR
%29 = and i32 %28, %0
%30 = icmp eq i32 %29, 0
%31 = select i1 %30, i8 45, i8 119
%32 = getelementptr inbounds i8, i8* %1, i64 2
store i8 %31, i8* %32
%33 = load i32, i32* @S_IXUSR
%34 = and i32 %33, %0
%35 = icmp eq i32 %34, 0
%36 = select i1 %35, i8 45, i8 120
%37 = getelementptr inbounds i8, i8* %1, i64 3
store i8 %36, i8* %37
%38 = load i32, i32* @S_IRGRP
%39 = and i32 %38, %0
%40 = icmp eq i32 %39, 0
%41 = select i1 %40, i8 45, i8 114
%42 = getelementptr inbounds i8, i8* %1, i64 4
store i8 %41, i8* %42
%43 = load i32, i32* @S_IWGRP
%44 = and i32 %43, %0
%45 = icmp eq i32 %44, 0
%46 = select i1 %45, i8 45, i8 119
%47 = getelementptr inbounds i8, i8* %1, i64 5
store i8 %46, i8* %47
%48 = load i32, i32* @S_IXGRP
%49 = and i32 %48, %0
%50 = icmp eq i32 %49, 0
%51 = select i1 %50, i8 45, i8 120
%52 = getelementptr inbounds i8, i8* %1, i64 6
store i8 %51, i8* %52
%53 = load i32, i32* @S_IROTH
%54 = and i32 %53, %0
%55 = icmp eq i32 %54, 0
%56 = select i1 %55, i8 45, i8 114
%57 = getelementptr inbounds i8, i8* %1, i64 7
store i8 %56, i8* %57
%58 = load i32, i32* @S_IWOTH
%59 = and i32 %58, %0
%60 = icmp eq i32 %59, 0
%61 = select i1 %60, i8 45, i8 119
%62 = getelementptr inbounds i8, i8* %1, i64 8
store i8 %61, i8* %62
%63 = load i32, i32* @S_IXOTH
%64 = and i32 %63, %0
%65 = icmp eq i32 %64, 0
%66 = select i1 %65, i8 45, i8 120
%67 = getelementptr inbounds i8, i8* %1, i64 9
store i8 %66, i8* %67
%68 = getelementptr inbounds i8, i8* %1, i64 10
store i8 0, i8* %68
ret i8* %1
}