#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;
};
struct dirent {
  char *d_name;
};
typedef int /*<<< orphan*/ DIR;

/* Variables and functions */
char EOF;
int /*<<< orphan*/ O_RDONLY;
int S_IFDIR;
int S_IFMT;
int atoi(char *);
int /*<<< orphan*/ close(int);
int /*<<< orphan*/ closedir(int /*<<< orphan*/ *);
int /*<<< orphan*/ isdigit(char);
int open(char *, int /*<<< orphan*/);
int /*<<< orphan*/ *opendir(char *);
int read(int, char *, int);
struct dirent *readdir(int /*<<< orphan*/ *);
int stat(char *, struct stat *);
int /*<<< orphan*/ strcat(char *, char *);
int /*<<< orphan*/ strcpy(char *, char *);
int isrunning(char *prog) {
  DIR *dir;
  struct dirent *dent;
  int i, fd;
  struct stat stbuf;
  char c;
  char statusfile[sizeof("/proc") + sizeof("status") + 10 + 3];
  if ((dir = opendir("/proc")) == NULL) {
    closedir(dir);
    return -2;
  }
  while ((dent = readdir(dir)) != NULL) {
    strcpy(statusfile, "/proc");
    strcat(statusfile, "/");
    strcat(statusfile, dent->d_name);
    if ((stat(statusfile, &stbuf) == -1) ||
        ((stbuf.st_mode & S_IFMT) != S_IFDIR))
      continue;
    i = sizeof("/proc");
    while ((c = statusfile[i++]) != '\0')
      if (!isdigit(c))
        break;
    if (c != '\0')
      continue;
    strcat(statusfile, "/");
    strcat(statusfile, "status");
    if ((fd = open(statusfile, O_RDONLY)) == -1) {
      close(fd);
      closedir(dir);
      return -3;
    }
    for (i = 0; i < 6; i++)
      if (read(fd, &c, 1) != 1) {
        close(fd);
        closedir(dir);
        return -4;
      }
    i = 0;
    while (read(fd, &c, 1) == 1 && c != '\n' && prog[i] != '\0' && c != EOF) {
      if (c == prog[i])
        i++;
      else
        i = 0;
    }
    close(fd);
    if (prog[i] == '\0') {
      closedir(dir);
      return atoi(dent->d_name);
    }
  }
  close(fd);
  closedir(dir);
  return 0;
}


x86 assembly (clang, -O0):
<isrunning>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %rdi,-0x10(%rbp)
lea    0xe3d(%rip),%rdi
call   1050 <opendir@plt>
mov    %rax,-0x18(%rbp)
cmp    $0x0,%rax
jne    11eb <isrunning+0x3b>
mov    -0x18(%rbp),%rdi
call   1070 <closedir@plt>
movl   $0xfffffffe,-0x4(%rbp)
jmp    147b <isrunning+0x2cb>
jmp    11f0 <isrunning+0x40>
mov    -0x18(%rbp),%rdi
call   10a0 <readdir@plt>
mov    %rax,-0x20(%rbp)
cmp    $0x0,%rax
je     1463 <isrunning+0x2b3>
lea    -0x50(%rbp),%rdi
lea    0xdee(%rip),%rsi
call   1040 <strcpy@plt>
lea    -0x50(%rbp),%rdi
lea    0xde4(%rip),%rsi
call   10d0 <strcat@plt>
lea    -0x50(%rbp),%rdi
mov    -0x20(%rbp),%rax
mov    (%rax),%rsi
call   10d0 <strcat@plt>
lea    -0x50(%rbp),%rdi
lea    -0x30(%rbp),%rsi
call   1090 <stat@plt>
cmp    $0xffffffff,%eax
je     1268 <isrunning+0xb8>
mov    -0x30(%rbp),%eax
mov    0x2d79(%rip),%rcx
and    (%rcx),%eax
mov    0x2d60(%rip),%rcx
cmp    (%rcx),%eax
je     126d <isrunning+0xbd>
jmp    11f0 <isrunning+0x40>
movl   $0x6,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x24(%rbp)
cltq
mov    -0x50(%rbp,%rax,1),%al
mov    %al,-0x31(%rbp)
movsbl %al,%eax
cmp    $0x0,%eax
je     12b0 <isrunning+0x100>
movsbl -0x31(%rbp),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
jne    12ab <isrunning+0xfb>
jmp    12b0 <isrunning+0x100>
jmp    1274 <isrunning+0xc4>
movsbl -0x31(%rbp),%eax
cmp    $0x0,%eax
je     12c2 <isrunning+0x112>
jmp    11f0 <isrunning+0x40>
lea    -0x50(%rbp),%rdi
lea    0xd39(%rip),%rsi
call   10d0 <strcat@plt>
lea    -0x50(%rbp),%rdi
lea    0xd2b(%rip),%rsi
call   10d0 <strcat@plt>
lea    -0x50(%rbp),%rdi
mov    0x2cfb(%rip),%rax
mov    (%rax),%esi
call   10b0 <open@plt>
mov    %eax,-0x28(%rbp)
cmp    $0xffffffff,%eax
jne    131d <isrunning+0x16d>
mov    -0x28(%rbp),%edi
call   1060 <close@plt>
mov    -0x18(%rbp),%rdi
call   1070 <closedir@plt>
movl   $0xfffffffd,-0x4(%rbp)
jmp    147b <isrunning+0x2cb>
movl   $0x0,-0x24(%rbp)
cmpl   $0x6,-0x24(%rbp)
jge    1378 <isrunning+0x1c8>
mov    -0x28(%rbp),%edi
lea    -0x31(%rbp),%rsi
mov    $0x1,%edx
call   1080 <read@plt>
cmp    $0x1,%eax
je     1365 <isrunning+0x1b5>
mov    -0x28(%rbp),%edi
call   1060 <close@plt>
mov    -0x18(%rbp),%rdi
call   1070 <closedir@plt>
movl   $0xfffffffc,-0x4(%rbp)
jmp    147b <isrunning+0x2cb>
jmp    136a <isrunning+0x1ba>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1324 <isrunning+0x174>
movl   $0x0,-0x24(%rbp)
mov    -0x28(%rbp),%edi
lea    -0x31(%rbp),%rsi
mov    $0x1,%edx
call   1080 <read@plt>
mov    %eax,%ecx
xor    %eax,%eax
cmp    $0x1,%ecx
mov    %al,-0x51(%rbp)
jne    13e2 <isrunning+0x232>
movsbl -0x31(%rbp),%ecx
xor    %eax,%eax
cmp    $0xa,%ecx
mov    %al,-0x51(%rbp)
je     13e2 <isrunning+0x232>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x51(%rbp)
je     13e2 <isrunning+0x232>
movsbl -0x31(%rbp),%eax
mov    0x2c09(%rip),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    13f2 <isrunning+0x242>
jmp    1424 <isrunning+0x274>
movsbl -0x31(%rbp),%eax
mov    -0x10(%rbp),%rcx
movslq -0x24(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
cmp    %ecx,%eax
jne    1418 <isrunning+0x268>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    141f <isrunning+0x26f>
movl   $0x0,-0x24(%rbp)
jmp    137f <isrunning+0x1cf>
mov    -0x28(%rbp),%edi
call   1060 <close@plt>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
jne    145e <isrunning+0x2ae>
mov    -0x18(%rbp),%rdi
call   1070 <closedir@plt>
mov    -0x20(%rbp),%rax
mov    (%rax),%rdi
call   10c0 <atoi@plt>
mov    %eax,-0x4(%rbp)
jmp    147b <isrunning+0x2cb>
jmp    11f0 <isrunning+0x40>
mov    -0x28(%rbp),%edi
call   1060 <close@plt>
mov    -0x18(%rbp),%rdi
call   1070 <closedir@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<isrunning>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %rdi,%r12
lea    0xe38(%rip),%rdi
call   1050 <opendir@plt>
test   %rax,%rax
je     13fd <isrunning+0x24d>
mov    %rax,%r15
lea    0x20(%rsp),%r14
mov    %rax,0x18(%rsp)
jmp    1200 <isrunning+0x50>
mov    %r13d,%edi
call   1060 <close@plt>
movslq %r15d,%rax
cmpb   $0x0,(%r12,%rax,1)
mov    0x18(%rsp),%r15
je     145c <isrunning+0x2ac>
mov    %r15,%rdi
call   10a0 <readdir@plt>
mov    %rax,%rbp
test   %rax,%rax
je     140b <isrunning+0x25b>
mov    %r14,%rdi
lea    0xde2(%rip),%rsi
call   1040 <strcpy@plt>
mov    %r14,%rdi
lea    0xdd9(%rip),%rsi
call   10d0 <strcat@plt>
mov    0x0(%rbp),%rsi
mov    %r14,%rdi
call   10d0 <strcat@plt>
mov    %r14,%rdi
lea    0x10(%rsp),%rsi
call   1090 <stat@plt>
cmp    $0xffffffff,%eax
je     1200 <isrunning+0x50>
mov    0x2d79(%rip),%rax
mov    (%rax),%eax
and    0x10(%rsp),%eax
mov    0x2d5c(%rip),%rcx
cmp    (%rcx),%eax
jne    1200 <isrunning+0x50>
lea    0x26(%rsp),%rbx
nopl   (%rax)
movzbl (%rbx),%eax
test   %al,%al
je     128c <isrunning+0xdc>
movsbl %al,%edi
call   1030 <isdigit@plt>
add    $0x1,%rbx
test   %eax,%eax
jne    1270 <isrunning+0xc0>
jmp    1200 <isrunning+0x50>
movb   $0x0,0xf(%rsp)
mov    %r14,%rdi
lea    0xd6b(%rip),%rsi
call   10d0 <strcat@plt>
mov    %r14,%rdi
lea    0xd5e(%rip),%rsi
call   10d0 <strcat@plt>
mov    0x2d32(%rip),%rax
mov    (%rax),%esi
mov    %r14,%rdi
call   10b0 <open@plt>
cmp    $0xffffffff,%eax
je     1443 <isrunning+0x293>
mov    %eax,%r13d
mov    %eax,%edi
lea    0xf(%rsp),%rbx
mov    %rbx,%rsi
mov    $0x1,%edx
call   1080 <read@plt>
cmp    $0x1,%eax
jne    141f <isrunning+0x26f>
mov    %r13d,%edi
mov    %rbx,%rsi
mov    $0x1,%edx
call   1080 <read@plt>
cmp    $0x1,%eax
jne    141f <isrunning+0x26f>
mov    %r13d,%edi
mov    %rbx,%rsi
mov    $0x1,%edx
call   1080 <read@plt>
cmp    $0x1,%eax
jne    141f <isrunning+0x26f>
mov    %r13d,%edi
mov    %rbx,%rsi
mov    $0x1,%edx
call   1080 <read@plt>
cmp    $0x1,%eax
jne    141f <isrunning+0x26f>
mov    %r13d,%edi
mov    %rbx,%rsi
mov    $0x1,%edx
call   1080 <read@plt>
cmp    $0x1,%eax
jne    141f <isrunning+0x26f>
mov    %r13d,%edi
mov    %rbx,%rsi
mov    $0x1,%edx
call   1080 <read@plt>
cmp    $0x1,%eax
jne    141f <isrunning+0x26f>
mov    %r13d,%edi
mov    %rbx,%rsi
mov    $0x1,%edx
call   1080 <read@plt>
xor    %r15d,%r15d
cmp    $0x1,%eax
jne    11e5 <isrunning+0x35>
mov    0xf(%rsp),%al
cmp    $0xa,%al
mov    0x2c51(%rip),%rbx
je     11e5 <isrunning+0x35>
xor    %r15d,%r15d
nopl   0x0(%rax,%rax,1)
movslq %r15d,%rcx
movzbl (%r12,%rcx,1),%ecx
test   %cl,%cl
je     11e5 <isrunning+0x35>
cmp    (%rbx),%al
je     11e5 <isrunning+0x35>
cmp    %cl,%al
je     13d0 <isrunning+0x220>
xor    %r15d,%r15d
jmp    13d4 <isrunning+0x224>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%r15d
lea    0xf(%rsp),%rsi
mov    %r13d,%edi
mov    $0x1,%edx
call   1080 <read@plt>
cmp    $0x1,%eax
jne    11e5 <isrunning+0x35>
movzbl 0xf(%rsp),%eax
cmp    $0xa,%al
jne    13a0 <isrunning+0x1f0>
jmp    11e5 <isrunning+0x35>
xor    %edi,%edi
call   1070 <closedir@plt>
mov    $0xfffffffe,%eax
jmp    1434 <isrunning+0x284>
mov    %r13d,%edi
call   1060 <close@plt>
mov    %r15,%rdi
call   1070 <closedir@plt>
xor    %eax,%eax
jmp    1434 <isrunning+0x284>
mov    %r13d,%edi
call   1060 <close@plt>
mov    %r15,%rdi
call   1070 <closedir@plt>
mov    $0xfffffffc,%eax
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    $0xffffffff,%edi
call   1060 <close@plt>
mov    %r15,%rdi
call   1070 <closedir@plt>
mov    $0xfffffffd,%eax
jmp    1434 <isrunning+0x284>
mov    %r15,%rdi
call   1070 <closedir@plt>
mov    0x0(%rbp),%rdi
call   10c0 <atoi@plt>
jmp    1434 <isrunning+0x284>

LLVM IR (-O0):
%struct.dirent = type { i8* }
%struct.stat = type { i32 }
@.str = [6 x i8] c"/proc\00"
@.str.1 = [2 x i8] c"/\00"
@S_IFMT = global i32 0
@S_IFDIR = global i32 0
@.str.2 = [7 x i8] c"status\00"
@O_RDONLY = global i32 0
@EOF = global i8 0
define i32 @isrunning(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i32*
%5 = alloca %struct.dirent*
%6 = alloca i32
%7 = alloca i32
%8 = alloca %struct.stat
%9 = alloca i8
%10 = alloca [26 x i8]
store i8* %0, i8** %3
%11 = call i32* @opendir(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
store i32* %11, i32** %4
%12 = icmp eq i32* %11, null
br i1 %12, label %13, label %16
13: ; preds = %1
%14 = load i32*, i32** %4
%15 = call i32 @closedir(i32* %14)
store i32 -2, i32* %2
br label %156
16: ; preds = %1
br label %17
17: ; preds = %150, %61, %41, %16
%18 = load i32*, i32** %4
%19 = call %struct.dirent* @readdir(i32* %18)
store %struct.dirent* %19, %struct.dirent** %5
%20 = icmp ne %struct.dirent* %19, null
br i1 %20, label %21, label %151
21: ; preds = %17
%22 = getelementptr inbounds [26 x i8], [26 x i8]* %10, i64 0, i64 0
%23 = call i32 @strcpy(i8* %22, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%24 = getelementptr inbounds [26 x i8], [26 x i8]* %10, i64 0, i64 0
%25 = call i32 @strcat(i8* %24, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%26 = getelementptr inbounds [26 x i8], [26 x i8]* %10, i64 0, i64 0
%27 = load %struct.dirent*, %struct.dirent** %5
%28 = getelementptr inbounds %struct.dirent, %struct.dirent* %27, i32 0, i32 0
%29 = load i8*, i8** %28
%30 = call i32 @strcat(i8* %26, i8* %29)
%31 = getelementptr inbounds [26 x i8], [26 x i8]* %10, i64 0, i64 0
%32 = call i32 @stat(i8* %31, %struct.stat* %8)
%33 = icmp eq i32 %32, -1
br i1 %33, label %41, label %34
34: ; preds = %21
%35 = getelementptr inbounds %struct.stat, %struct.stat* %8, i32 0, i32 0
%36 = load i32, i32* %35
%37 = load i32, i32* @S_IFMT
%38 = and i32 %36, %37
%39 = load i32, i32* @S_IFDIR
%40 = icmp ne i32 %38, %39
br i1 %40, label %41, label %42
41: ; preds = %34, %21
br label %17
42: ; preds = %34
store i32 6, i32* %6
br label %43
43: ; preds = %56, %42
%44 = load i32, i32* %6
%45 = add nsw i32 %44, 1
store i32 %45, i32* %6
%46 = sext i32 %44 to i64
%47 = getelementptr inbounds [26 x i8], [26 x i8]* %10, i64 0, i64 %46
%48 = load i8, i8* %47
store i8 %48, i8* %9
%49 = sext i8 %48 to i32
%50 = icmp ne i32 %49, 0
br i1 %50, label %51, label %57
51: ; preds = %43
%52 = load i8, i8* %9
%53 = call i32 @isdigit(i8 signext %52)
%54 = icmp ne i32 %53, 0
br i1 %54, label %56, label %55
55: ; preds = %51
br label %57
56: ; preds = %51
br label %43
57: ; preds = %55, %43
%58 = load i8, i8* %9
%59 = sext i8 %58 to i32
%60 = icmp ne i32 %59, 0
br i1 %60, label %61, label %62
61: ; preds = %57
br label %17
62: ; preds = %57
%63 = getelementptr inbounds [26 x i8], [26 x i8]* %10, i64 0, i64 0
%64 = call i32 @strcat(i8* %63, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%65 = getelementptr inbounds [26 x i8], [26 x i8]* %10, i64 0, i64 0
%66 = call i32 @strcat(i8* %65, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0))
%67 = getelementptr inbounds [26 x i8], [26 x i8]* %10, i64 0, i64 0
%68 = load i32, i32* @O_RDONLY
%69 = call i32 @open(i8* %67, i32 %68)
store i32 %69, i32* %7
%70 = icmp eq i32 %69, -1
br i1 %70, label %71, label %76
71: ; preds = %62
%72 = load i32, i32* %7
%73 = call i32 @close(i32 %72)
%74 = load i32*, i32** %4
%75 = call i32 @closedir(i32* %74)
store i32 -3, i32* %2
br label %156
76: ; preds = %62
store i32 0, i32* %6
br label %77
77: ; preds = %90, %76
%78 = load i32, i32* %6
%79 = icmp slt i32 %78, 6
br i1 %79, label %80, label %93
80: ; preds = %77
%81 = load i32, i32* %7
%82 = call i32 @read(i32 %81, i8* %9, i32 1)
%83 = icmp ne i32 %82, 1
br i1 %83, label %84, label %89
84: ; preds = %80
%85 = load i32, i32* %7
%86 = call i32 @close(i32 %85)
%87 = load i32*, i32** %4
%88 = call i32 @closedir(i32* %87)
store i32 -4, i32* %2
br label %156
89: ; preds = %80
br label %90
90: ; preds = %89
%91 = load i32, i32* %6
%92 = add nsw i32 %91, 1
store i32 %92, i32* %6
br label %77
93: ; preds = %77
store i32 0, i32* %6
br label %94
94: ; preds = %132, %93
%95 = load i32, i32* %7
%96 = call i32 @read(i32 %95, i8* %9, i32 1)
%97 = icmp eq i32 %96, 1
br i1 %97, label %98, label %116
98: ; preds = %94
%99 = load i8, i8* %9
%100 = sext i8 %99 to i32
%101 = icmp ne i32 %100, 10
br i1 %101, label %102, label %116
102: ; preds = %98
%103 = load i8*, i8** %3
%104 = load i32, i32* %6
%105 = sext i32 %104 to i64
%106 = getelementptr inbounds i8, i8* %103, i64 %105
%107 = load i8, i8* %106
%108 = sext i8 %107 to i32
%109 = icmp ne i32 %108, 0
br i1 %109, label %110, label %116
110: ; preds = %102
%111 = load i8, i8* %9
%112 = sext i8 %111 to i32
%113 = load i8, i8* @EOF
%114 = sext i8 %113 to i32
%115 = icmp ne i32 %112, %114
br label %116
116: ; preds = %110, %102, %98, %94
%117 = phi i1 [ false, %102 ], [ false, %98 ], [ false, %94 ], [ %115, %110 ]
br i1 %117, label %118, label %133
118: ; preds = %116
%119 = load i8, i8* %9
%120 = sext i8 %119 to i32
%121 = load i8*, i8** %3
%122 = load i32, i32* %6
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds i8, i8* %121, i64 %123
%125 = load i8, i8* %124
%126 = sext i8 %125 to i32
%127 = icmp eq i32 %120, %126
br i1 %127, label %128, label %131
128: ; preds = %118
%129 = load i32, i32* %6
%130 = add nsw i32 %129, 1
store i32 %130, i32* %6
br label %132
131: ; preds = %118
store i32 0, i32* %6
br label %132
132: ; preds = %131, %128
br label %94
133: ; preds = %116
%134 = load i32, i32* %7
%135 = call i32 @close(i32 %134)
%136 = load i8*, i8** %3
%137 = load i32, i32* %6
%138 = sext i32 %137 to i64
%139 = getelementptr inbounds i8, i8* %136, i64 %138
%140 = load i8, i8* %139
%141 = sext i8 %140 to i32
%142 = icmp eq i32 %141, 0
br i1 %142, label %143, label %150
143: ; preds = %133
%144 = load i32*, i32** %4
%145 = call i32 @closedir(i32* %144)
%146 = load %struct.dirent*, %struct.dirent** %5
%147 = getelementptr inbounds %struct.dirent, %struct.dirent* %146, i32 0, i32 0
%148 = load i8*, i8** %147
%149 = call i32 @atoi(i8* %148)
store i32 %149, i32* %2
br label %156
150: ; preds = %133
br label %17
151: ; preds = %17
%152 = load i32, i32* %7
%153 = call i32 @close(i32 %152)
%154 = load i32*, i32** %4
%155 = call i32 @closedir(i32* %154)
store i32 0, i32* %2
br label %156
156: ; preds = %151, %143, %84, %71, %13
%157 = load i32, i32* %2
ret i32 %157
}

LLVM IR (-O2):
%struct.stat = type { i32 }
%struct.dirent = type { i8* }
@.str = [6 x i8] c"/proc\00"
@.str.1 = [2 x i8] c"/\00"
@S_IFMT = global i32 0
@S_IFDIR = global i32 0
@.str.2 = [7 x i8] c"status\00"
@O_RDONLY = global i32 0
@EOF = global i8 0
define i32 @isrunning(i8* nocapture %0) {
%2 = alloca %struct.stat
%3 = alloca i8
%4 = alloca [26 x i8]
%5 = bitcast %struct.stat* %2 to i8*
%6 = getelementptr inbounds [26 x i8], [26 x i8]* %4, i64 0, i64 0
%7 = tail call i32* @opendir(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%8 = icmp eq i32* %7, null
br i1 %8, label %11, label %9
9: ; preds = %1
%10 = getelementptr inbounds %struct.stat, %struct.stat* %2, i64 0, i32 0
br label %105
11: ; preds = %1
%12 = tail call i32 @closedir(i32* null)
br label %118
13: ; preds = %105, %29
%14 = phi %struct.dirent* [ %31, %29 ], [ %108, %105 ]
%15 = phi i8 [ %30, %29 ], [ %106, %105 ]
%16 = call i32 @strcpy(i8* %6, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%17 = call i32 @strcat(i8* %6, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%18 = getelementptr inbounds %struct.dirent, %struct.dirent* %14, i64 0, i32 0
%19 = load i8*, i8** %18
%20 = call i32 @strcat(i8* %6, i8* %19)
%21 = call i32 @stat(i8* %6, %struct.stat* %2)
%22 = icmp eq i32 %21, -1
br i1 %22, label %29, label %23
23: ; preds = %13
%24 = load i32, i32* %10
%25 = load i32, i32* @S_IFMT
%26 = and i32 %25, %24
%27 = load i32, i32* @S_IFDIR
%28 = icmp eq i32 %26, %27
br i1 %28, label %33, label %29
29: ; preds = %38, %13, %23
%30 = phi i8 [ %15, %23 ], [ %15, %13 ], [ %36, %38 ]
%31 = call %struct.dirent* @readdir(i32* %7)
%32 = icmp eq %struct.dirent* %31, null
br i1 %32, label %115, label %13
33: ; preds = %23, %38
%34 = phi i64 [ %39, %38 ], [ 6, %23 ]
%35 = getelementptr inbounds [26 x i8], [26 x i8]* %4, i64 0, i64 %34
%36 = load i8, i8* %35
%37 = icmp eq i8 %36, 0
br i1 %37, label %42, label %38
38: ; preds = %33
%39 = add nuw i64 %34, 1
%40 = call i32 @isdigit(i8 signext %36)
%41 = icmp eq i32 %40, 0
br i1 %41, label %29, label %33
42: ; preds = %33
store i8 0, i8* %3
%43 = call i32 @strcat(i8* %6, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%44 = call i32 @strcat(i8* %6, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0))
%45 = load i32, i32* @O_RDONLY
%46 = call i32 @open(i8* %6, i32 %45)
%47 = icmp eq i32 %46, -1
br i1 %47, label %51, label %48
48: ; preds = %42
%49 = call i32 @read(i32 %46, i8* %3, i32 1)
%50 = icmp eq i32 %49, 1
br i1 %50, label %54, label %75
51: ; preds = %42
%52 = call i32 @close(i32 -1)
%53 = call i32 @closedir(i32* %7)
br label %118
54: ; preds = %48
%55 = call i32 @read(i32 %46, i8* %3, i32 1)
%56 = icmp eq i32 %55, 1
br i1 %56, label %57, label %75
57: ; preds = %54
%58 = call i32 @read(i32 %46, i8* %3, i32 1)
%59 = icmp eq i32 %58, 1
br i1 %59, label %60, label %75
60: ; preds = %57
%61 = call i32 @read(i32 %46, i8* %3, i32 1)
%62 = icmp eq i32 %61, 1
br i1 %62, label %63, label %75
63: ; preds = %60
%64 = call i32 @read(i32 %46, i8* %3, i32 1)
%65 = icmp eq i32 %64, 1
br i1 %65, label %66, label %75
66: ; preds = %63
%67 = call i32 @read(i32 %46, i8* %3, i32 1)
%68 = icmp eq i32 %67, 1
br i1 %68, label %69, label %75
69: ; preds = %66
%70 = call i32 @read(i32 %46, i8* %3, i32 1)
%71 = icmp eq i32 %70, 1
%72 = load i8, i8* %3
%73 = icmp ne i8 %72, 10
%74 = select i1 %71, i1 %73, i1 false
br i1 %74, label %78, label %97
75: ; preds = %66, %63, %60, %57, %54, %48
%76 = call i32 @close(i32 %46)
%77 = call i32 @closedir(i32* %7)
br label %118
78: ; preds = %69, %88
%79 = phi i8 [ %94, %88 ], [ %72, %69 ]
%80 = phi i32 [ %91, %88 ], [ 0, %69 ]
%81 = sext i32 %80 to i64
%82 = getelementptr inbounds i8, i8* %0, i64 %81
%83 = load i8, i8* %82
%84 = icmp eq i8 %83, 0
%85 = load i8, i8* @EOF
%86 = icmp eq i8 %79, %85
%87 = select i1 %84, i1 true, i1 %86
br i1 %87, label %97, label %88
88: ; preds = %78
%89 = icmp eq i8 %79, %83
%90 = add nsw i32 %80, 1
%91 = select i1 %89, i32 %90, i32 0
%92 = call i32 @read(i32 %46, i8* %3, i32 1)
%93 = icmp eq i32 %92, 1
%94 = load i8, i8* %3
%95 = icmp ne i8 %94, 10
%96 = select i1 %93, i1 %95, i1 false
br i1 %96, label %78, label %97
97: ; preds = %78, %88, %69
%98 = phi i8 [ %72, %69 ], [ %94, %88 ], [ %79, %78 ]
%99 = phi i32 [ 0, %69 ], [ %91, %88 ], [ %80, %78 ]
%100 = call i32 @close(i32 %46)
%101 = sext i32 %99 to i64
%102 = getelementptr inbounds i8, i8* %0, i64 %101
%103 = load i8, i8* %102
%104 = icmp eq i8 %103, 0
br i1 %104, label %110, label %105
105: ; preds = %9, %97
%106 = phi i8 [ undef, %9 ], [ %98, %97 ]
%107 = phi i32 [ undef, %9 ], [ %46, %97 ]
%108 = call %struct.dirent* @readdir(i32* %7)
%109 = icmp eq %struct.dirent* %108, null
br i1 %109, label %115, label %13
110: ; preds = %97
%111 = getelementptr inbounds %struct.dirent, %struct.dirent* %14, i64 0, i32 0
%112 = call i32 @closedir(i32* %7)
%113 = load i8*, i8** %111
%114 = call i32 @atoi(i8* %113)
br label %118
115: ; preds = %105, %29
%116 = call i32 @close(i32 %107)
%117 = call i32 @closedir(i32* %7)
br label %118
118: ; preds = %115, %110, %75, %51, %11
%119 = phi i32 [ -2, %11 ], [ -3, %51 ], [ -4, %75 ], [ %114, %110 ], [ 0, %115 ]
ret i32 %119
}