#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 /*<<< orphan*/ st_mode;
};
struct dirent {
  scalar_t__ d_type;
  int /*<<< orphan*/ d_name;
};

/* Variables and functions */
unsigned char DT_BLK;
unsigned char DT_CHR;
unsigned char DT_DIR;
unsigned char DT_FIFO;
unsigned char DT_LNK;
unsigned char DT_REG;
unsigned char DT_SOCK;
scalar_t__ DT_UNKNOWN;
scalar_t__ S_ISBLK(int /*<<< orphan*/);
scalar_t__ S_ISCHR(int /*<<< orphan*/);
scalar_t__ S_ISDIR(int /*<<< orphan*/);
scalar_t__ S_ISFIFO(int /*<<< orphan*/);
scalar_t__ S_ISLNK(int /*<<< orphan*/);
scalar_t__ S_ISREG(int /*<<< orphan*/);
scalar_t__ S_ISSOCK(int /*<<< orphan*/);
int /*<<< orphan*/ assert(struct dirent const *const);
int stat(int /*<<< orphan*/, struct stat *);
unsigned char dent_type(const struct dirent *const ent) {
  assert(ent);
  if (ent->d_type != DT_UNKNOWN)
    return ent->d_type;
  struct stat st;
  if (stat(ent->d_name, &st) == -1)
    return DT_UNKNOWN;
  return S_ISBLK(st.st_mode)    ? DT_BLK
         : S_ISCHR(st.st_mode)  ? DT_CHR
         : S_ISDIR(st.st_mode)  ? DT_DIR
         : S_ISFIFO(st.st_mode) ? DT_FIFO
         : S_ISLNK(st.st_mode)  ? DT_LNK
         : S_ISREG(st.st_mode)  ? DT_REG
         : S_ISSOCK(st.st_mode) ? DT_SOCK
                                : DT_UNKNOWN;
}


x86 assembly (clang, -O0):
<dent_type>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1070 <assert@plt>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    0x2e35(%rip),%rcx
cmp    (%rcx),%rax
je     11cb <dent_type+0x3b>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %al,-0x1(%rbp)
jmp    133e <dent_type+0x1ae>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%edi
lea    -0x18(%rbp),%rsi
call   1080 <stat@plt>
cmp    $0xffffffff,%eax
jne    11f6 <dent_type+0x66>
mov    0x2dfd(%rip),%rax
mov    (%rax),%rax
mov    %al,-0x1(%rbp)
jmp    133e <dent_type+0x1ae>
mov    -0x18(%rbp),%edi
call   10b0 <S_ISBLK@plt>
cmp    $0x0,%rax
je     121b <dent_type+0x8b>
mov    0x2db9(%rip),%rax
movzbl (%rax),%eax
mov    %rax,-0x20(%rbp)
jmp    1337 <dent_type+0x1a7>
mov    -0x18(%rbp),%edi
call   10a0 <S_ISCHR@plt>
cmp    $0x0,%rax
je     1240 <dent_type+0xb0>
mov    0x2d8c(%rip),%rax
movzbl (%rax),%eax
mov    %rax,-0x28(%rbp)
jmp    132f <dent_type+0x19f>
mov    -0x18(%rbp),%edi
call   1060 <S_ISDIR@plt>
cmp    $0x0,%rax
je     1265 <dent_type+0xd5>
mov    0x2d77(%rip),%rax
movzbl (%rax),%eax
mov    %rax,-0x30(%rbp)
jmp    1327 <dent_type+0x197>
mov    -0x18(%rbp),%edi
call   1040 <S_ISFIFO@plt>
cmp    $0x0,%rax
je     128a <dent_type+0xfa>
mov    0x2d2a(%rip),%rax
movzbl (%rax),%eax
mov    %rax,-0x38(%rbp)
jmp    131f <dent_type+0x18f>
mov    -0x18(%rbp),%edi
call   1030 <S_ISLNK@plt>
cmp    $0x0,%rax
je     12af <dent_type+0x11f>
mov    0x2d15(%rip),%rax
movzbl (%rax),%eax
mov    %rax,-0x40(%rbp)
jmp    1317 <dent_type+0x187>
mov    -0x18(%rbp),%edi
call   1090 <S_ISREG@plt>
cmp    $0x0,%rax
je     12d4 <dent_type+0x144>
mov    0x2d10(%rip),%rax
movzbl (%rax),%eax
mov    %rax,-0x48(%rbp)
jmp    130f <dent_type+0x17f>
mov    -0x18(%rbp),%edi
call   1050 <S_ISSOCK@plt>
cmp    $0x0,%rax
je     12f9 <dent_type+0x169>
mov    0x2cb3(%rip),%rax
movzbl (%rax),%eax
mov    %rax,-0x50(%rbp)
jmp    1307 <dent_type+0x177>
mov    0x2ce8(%rip),%rax
mov    (%rax),%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    %al,-0x1(%rbp)
movzbl -0x1(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dent_type>:
push   %r14
push   %rbx
push   %rax
mov    %rdi,%rbx
call   1070 <assert@plt>
mov    (%rbx),%rax
mov    0x2e42(%rip),%r14
cmp    (%r14),%rax
jne    126c <dent_type+0xdc>
mov    0x8(%rbx),%edi
mov    %rsp,%rsi
call   1080 <stat@plt>
cmp    $0xffffffff,%eax
je     1269 <dent_type+0xd9>
mov    (%rsp),%edi
call   10b0 <S_ISBLK@plt>
test   %rax,%rax
je     11df <dent_type+0x4f>
mov    0x2df1(%rip),%rax
movzbl (%rax),%eax
jmp    126c <dent_type+0xdc>
mov    (%rsp),%edi
call   10a0 <S_ISCHR@plt>
test   %rax,%rax
je     11f8 <dent_type+0x68>
mov    0x2dcd(%rip),%rax
movzbl (%rax),%eax
jmp    126c <dent_type+0xdc>
mov    (%rsp),%edi
call   1060 <S_ISDIR@plt>
test   %rax,%rax
je     1211 <dent_type+0x81>
mov    0x2dc4(%rip),%rax
movzbl (%rax),%eax
jmp    126c <dent_type+0xdc>
mov    (%rsp),%edi
call   1040 <S_ISFIFO@plt>
test   %rax,%rax
je     122a <dent_type+0x9a>
mov    0x2d83(%rip),%rax
movzbl (%rax),%eax
jmp    126c <dent_type+0xdc>
mov    (%rsp),%edi
call   1030 <S_ISLNK@plt>
test   %rax,%rax
je     1243 <dent_type+0xb3>
mov    0x2d7a(%rip),%rax
movzbl (%rax),%eax
jmp    126c <dent_type+0xdc>
mov    (%rsp),%edi
call   1090 <S_ISREG@plt>
test   %rax,%rax
je     125c <dent_type+0xcc>
mov    0x2d81(%rip),%rax
movzbl (%rax),%eax
jmp    126c <dent_type+0xdc>
mov    (%rsp),%edi
call   1050 <S_ISSOCK@plt>
test   %rax,%rax
jne    1274 <dent_type+0xe4>
mov    (%r14),%rax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
mov    0x2d25(%rip),%rax
movzbl (%rax),%eax
jmp    126c <dent_type+0xdc>

LLVM IR (-O0):
%struct.dirent = type { i64, i32 }
%struct.stat = type { i32 }
@DT_UNKNOWN = global i64 0
@DT_BLK = global i8 0
@DT_CHR = global i8 0
@DT_DIR = global i8 0
@DT_FIFO = global i8 0
@DT_LNK = global i8 0
@DT_REG = global i8 0
@DT_SOCK = global i8 0
define zeroext i8 @dent_type(%struct.dirent* %0) {
%2 = alloca i8
%3 = alloca %struct.dirent*
%4 = alloca %struct.stat
store %struct.dirent* %0, %struct.dirent** %3
%5 = load %struct.dirent*, %struct.dirent** %3
%6 = call i32 @assert(%struct.dirent* %5)
%7 = load %struct.dirent*, %struct.dirent** %3
%8 = getelementptr inbounds %struct.dirent, %struct.dirent* %7, i32 0, i32 0
%9 = load i64, i64* %8
%10 = load i64, i64* @DT_UNKNOWN
%11 = icmp ne i64 %9, %10
br i1 %11, label %12, label %17
12: ; preds = %1
%13 = load %struct.dirent*, %struct.dirent** %3
%14 = getelementptr inbounds %struct.dirent, %struct.dirent* %13, i32 0, i32 0
%15 = load i64, i64* %14
%16 = trunc i64 %15 to i8
store i8 %16, i8* %2
br label %99
17: ; preds = %1
%18 = load %struct.dirent*, %struct.dirent** %3
%19 = getelementptr inbounds %struct.dirent, %struct.dirent* %18, i32 0, i32 1
%20 = load i32, i32* %19
%21 = call i32 @stat(i32 %20, %struct.stat* %4)
%22 = icmp eq i32 %21, -1
br i1 %22, label %23, label %26
23: ; preds = %17
%24 = load i64, i64* @DT_UNKNOWN
%25 = trunc i64 %24 to i8
store i8 %25, i8* %2
br label %99
26: ; preds = %17
%27 = getelementptr inbounds %struct.stat, %struct.stat* %4, i32 0, i32 0
%28 = load i32, i32* %27
%29 = call i64 @S_ISBLK(i32 %28)
%30 = icmp ne i64 %29, 0
br i1 %30, label %31, label %34
31: ; preds = %26
%32 = load i8, i8* @DT_BLK
%33 = zext i8 %32 to i64
br label %96
34: ; preds = %26
%35 = getelementptr inbounds %struct.stat, %struct.stat* %4, i32 0, i32 0
%36 = load i32, i32* %35
%37 = call i64 @S_ISCHR(i32 %36)
%38 = icmp ne i64 %37, 0
br i1 %38, label %39, label %42
39: ; preds = %34
%40 = load i8, i8* @DT_CHR
%41 = zext i8 %40 to i64
br label %94
42: ; preds = %34
%43 = getelementptr inbounds %struct.stat, %struct.stat* %4, i32 0, i32 0
%44 = load i32, i32* %43
%45 = call i64 @S_ISDIR(i32 %44)
%46 = icmp ne i64 %45, 0
br i1 %46, label %47, label %50
47: ; preds = %42
%48 = load i8, i8* @DT_DIR
%49 = zext i8 %48 to i64
br label %92
50: ; preds = %42
%51 = getelementptr inbounds %struct.stat, %struct.stat* %4, i32 0, i32 0
%52 = load i32, i32* %51
%53 = call i64 @S_ISFIFO(i32 %52)
%54 = icmp ne i64 %53, 0
br i1 %54, label %55, label %58
55: ; preds = %50
%56 = load i8, i8* @DT_FIFO
%57 = zext i8 %56 to i64
br label %90
58: ; preds = %50
%59 = getelementptr inbounds %struct.stat, %struct.stat* %4, i32 0, i32 0
%60 = load i32, i32* %59
%61 = call i64 @S_ISLNK(i32 %60)
%62 = icmp ne i64 %61, 0
br i1 %62, label %63, label %66
63: ; preds = %58
%64 = load i8, i8* @DT_LNK
%65 = zext i8 %64 to i64
br label %88
66: ; preds = %58
%67 = getelementptr inbounds %struct.stat, %struct.stat* %4, i32 0, i32 0
%68 = load i32, i32* %67
%69 = call i64 @S_ISREG(i32 %68)
%70 = icmp ne i64 %69, 0
br i1 %70, label %71, label %74
71: ; preds = %66
%72 = load i8, i8* @DT_REG
%73 = zext i8 %72 to i64
br label %86
74: ; preds = %66
%75 = getelementptr inbounds %struct.stat, %struct.stat* %4, i32 0, i32 0
%76 = load i32, i32* %75
%77 = call i64 @S_ISSOCK(i32 %76)
%78 = icmp ne i64 %77, 0
br i1 %78, label %79, label %82
79: ; preds = %74
%80 = load i8, i8* @DT_SOCK
%81 = zext i8 %80 to i64
br label %84
82: ; preds = %74
%83 = load i64, i64* @DT_UNKNOWN
br label %84
84: ; preds = %82, %79
%85 = phi i64 [ %81, %79 ], [ %83, %82 ]
br label %86
86: ; preds = %84, %71
%87 = phi i64 [ %73, %71 ], [ %85, %84 ]
br label %88
88: ; preds = %86, %63
%89 = phi i64 [ %65, %63 ], [ %87, %86 ]
br label %90
90: ; preds = %88, %55
%91 = phi i64 [ %57, %55 ], [ %89, %88 ]
br label %92
92: ; preds = %90, %47
%93 = phi i64 [ %49, %47 ], [ %91, %90 ]
br label %94
94: ; preds = %92, %39
%95 = phi i64 [ %41, %39 ], [ %93, %92 ]
br label %96
96: ; preds = %94, %31
%97 = phi i64 [ %33, %31 ], [ %95, %94 ]
%98 = trunc i64 %97 to i8
store i8 %98, i8* %2
br label %99
99: ; preds = %96, %23, %12
%100 = load i8, i8* %2
ret i8 %100
}

LLVM IR (-O2):
%struct.dirent = type { i64, i32 }
%struct.stat = type { i32 }
@DT_UNKNOWN = global i64 0
@DT_BLK = global i8 0
@DT_CHR = global i8 0
@DT_DIR = global i8 0
@DT_FIFO = global i8 0
@DT_LNK = global i8 0
@DT_REG = global i8 0
@DT_SOCK = global i8 0
define zeroext i8 @dent_type(%struct.dirent* %0) {
%2 = alloca %struct.stat
%3 = tail call i32 @assert(%struct.dirent* %0)
%4 = getelementptr inbounds %struct.dirent, %struct.dirent* %0, i64 0, i32 0
%5 = load i64, i64* %4
%6 = load i64, i64* @DT_UNKNOWN
%7 = icmp eq i64 %5, %6
br i1 %7, label %8, label %69
8: ; preds = %1
%9 = bitcast %struct.stat* %2 to i8*
%10 = getelementptr inbounds %struct.dirent, %struct.dirent* %0, i64 0, i32 1
%11 = load i32, i32* %10
%12 = call i32 @stat(i32 %11, %struct.stat* %2)
%13 = icmp eq i32 %12, -1
br i1 %13, label %14, label %16
14: ; preds = %8
%15 = load i64, i64* @DT_UNKNOWN
br label %67
16: ; preds = %8
%17 = getelementptr inbounds %struct.stat, %struct.stat* %2, i64 0, i32 0
%18 = load i32, i32* %17
%19 = call i64 @S_ISBLK(i32 %18)
%20 = icmp eq i64 %19, 0
br i1 %20, label %24, label %21
21: ; preds = %16
%22 = load i8, i8* @DT_BLK
%23 = zext i8 %22 to i64
br label %67
24: ; preds = %16
%25 = load i32, i32* %17
%26 = call i64 @S_ISCHR(i32 %25)
%27 = icmp eq i64 %26, 0
br i1 %27, label %31, label %28
28: ; preds = %24
%29 = load i8, i8* @DT_CHR
%30 = zext i8 %29 to i64
br label %67
31: ; preds = %24
%32 = load i32, i32* %17
%33 = call i64 @S_ISDIR(i32 %32)
%34 = icmp eq i64 %33, 0
br i1 %34, label %38, label %35
35: ; preds = %31
%36 = load i8, i8* @DT_DIR
%37 = zext i8 %36 to i64
br label %67
38: ; preds = %31
%39 = load i32, i32* %17
%40 = call i64 @S_ISFIFO(i32 %39)
%41 = icmp eq i64 %40, 0
br i1 %41, label %45, label %42
42: ; preds = %38
%43 = load i8, i8* @DT_FIFO
%44 = zext i8 %43 to i64
br label %67
45: ; preds = %38
%46 = load i32, i32* %17
%47 = call i64 @S_ISLNK(i32 %46)
%48 = icmp eq i64 %47, 0
br i1 %48, label %52, label %49
49: ; preds = %45
%50 = load i8, i8* @DT_LNK
%51 = zext i8 %50 to i64
br label %67
52: ; preds = %45
%53 = load i32, i32* %17
%54 = call i64 @S_ISREG(i32 %53)
%55 = icmp eq i64 %54, 0
br i1 %55, label %59, label %56
56: ; preds = %52
%57 = load i8, i8* @DT_REG
%58 = zext i8 %57 to i64
br label %67
59: ; preds = %52
%60 = load i32, i32* %17
%61 = call i64 @S_ISSOCK(i32 %60)
%62 = icmp eq i64 %61, 0
%63 = load i8, i8* @DT_SOCK
%64 = zext i8 %63 to i64
%65 = load i64, i64* @DT_UNKNOWN
%66 = select i1 %62, i64 %65, i64 %64
br label %67
67: ; preds = %21, %35, %49, %59, %56, %42, %28, %14
%68 = phi i64 [ %15, %14 ], [ %23, %21 ], [ %30, %28 ], [ %37, %35 ], [ %44, %42 ], [ %51, %49 ], [ %58, %56 ], [ %66, %59 ]
br label %69
69: ; preds = %1, %67
%70 = phi i64 [ %68, %67 ], [ %5, %1 ]
%71 = trunc i64 %70 to i8
ret i8 %71
}