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

/* Variables and functions */
scalar_t__ DT_DIR;
scalar_t__ DT_REG;
int /*<<< orphan*/ Default_Option1(char *, char *, char *);
scalar_t__ chdir(char *);
int /*<<< orphan*/ closedir(int /*<<< orphan*/ *);
int errno;
int /*<<< orphan*/ *opendir(char *);
int /*<<< orphan*/ perror(char *);
int /*<<< orphan*/ printf(char *, char *);
struct dirent *readdir(int /*<<< orphan*/ *);
scalar_t__ strcmp(char *, char *);
int text_or_binary(char *);
int Grep_dir(char *str, char *search, char *dir_name, char *argb) {
  DIR *dir;
  struct dirent *dp;
  if (!(dir = opendir(dir_name))) {
    perror("Error");
    return errno;
  }
  if (!(dp = readdir(dir))) {
    perror("Error");
    return errno;
  }
  if (argb == NULL) {
    if (chdir(dir_name)) {
      perror("Error");
      return errno;
    }
    do {
      if ((strcmp(dp->d_name, ".") != 0) && (strcmp(dp->d_name, "..") != 0)) {
        if ((dp->d_type != DT_DIR) && (dp->d_type != DT_REG))
          continue;
        else {
          if (dp->d_type == DT_REG) {
            if (text_or_binary(dp->d_name) == 1)
              Default_Option1(str, search, dp->d_name);
            else if (text_or_binary(dp->d_name) == 0)
              printf("Binary file %s matches\n", dp->d_name);
            else
              continue;
          } else if (dp->d_type == DT_DIR)
            Grep_dir(str, search, dp->d_name, argb);
          else
            continue;
        }
      } else
        continue;
    } while ((dp = readdir(dir)));
    chdir("..");
  } else if (!strcmp(argb, "*")) {
    do {
      if ((strcmp(dp->d_name, ".") != 0) && (strcmp(dp->d_name, "..") != 0)) {
        if ((dp->d_type != DT_DIR) && (dp->d_type != DT_REG))
          continue;
        else {
          if (dp->d_type == DT_REG) {
            if (text_or_binary(dp->d_name) == 1)
              Default_Option1(str, search, dp->d_name);
            else if (text_or_binary(dp->d_name) == 0)
              printf("Binary file %s matches\n", dp->d_name);
            else
              continue;
          } else
            continue;
        }
      } else
        continue;
    } while ((dp = readdir(dir)));
  }
  closedir(dir);
  return 0;
}


x86 assembly (clang, -O0):
<Grep_dir>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    -0x20(%rbp),%rdi
call   1040 <opendir@plt>
mov    %rax,-0x30(%rbp)
cmp    $0x0,%rax
jne    11ec <Grep_dir+0x4c>
lea    0xe2a(%rip),%rdi
call   10b0 <perror@plt>
mov    0x2dee(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1526 <Grep_dir+0x386>
mov    -0x30(%rbp),%rdi
call   1090 <readdir@plt>
mov    %rax,-0x38(%rbp)
cmp    $0x0,%rax
jne    1220 <Grep_dir+0x80>
lea    0xdf6(%rip),%rdi
call   10b0 <perror@plt>
mov    0x2dba(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1526 <Grep_dir+0x386>
cmpq   $0x0,-0x28(%rbp)
jne    13cc <Grep_dir+0x22c>
mov    -0x20(%rbp),%rdi
call   1050 <chdir@plt>
cmp    $0x0,%rax
je     125b <Grep_dir+0xbb>
lea    0xdbb(%rip),%rdi
call   10b0 <perror@plt>
mov    0x2d7f(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1526 <Grep_dir+0x386>
jmp    1260 <Grep_dir+0xc0>
mov    -0x38(%rbp),%rax
mov    (%rax),%rdi
lea    0xd99(%rip),%rsi
call   1080 <strcmp@plt>
cmp    $0x0,%rax
je     139a <Grep_dir+0x1fa>
mov    -0x38(%rbp),%rax
mov    (%rax),%rdi
lea    0xd7b(%rip),%rsi
call   1080 <strcmp@plt>
cmp    $0x0,%rax
je     139a <Grep_dir+0x1fa>
mov    -0x38(%rbp),%rax
mov    0x8(%rax),%rax
mov    0x2d2f(%rip),%rcx
cmp    (%rcx),%rax
je     12cf <Grep_dir+0x12f>
mov    -0x38(%rbp),%rax
mov    0x8(%rax),%rax
mov    0x2d1f(%rip),%rcx
cmp    (%rcx),%rax
je     12cf <Grep_dir+0x12f>
jmp    13a4 <Grep_dir+0x204>
mov    -0x38(%rbp),%rax
mov    0x8(%rax),%rax
mov    0x2d02(%rip),%rcx
cmp    (%rcx),%rax
jne    1351 <Grep_dir+0x1b1>
mov    -0x38(%rbp),%rax
mov    (%rax),%rdi
call   10c0 <text_or_binary@plt>
cmp    $0x1,%eax
jne    1315 <Grep_dir+0x175>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x38(%rbp),%rax
mov    (%rax),%rdx
call   10a0 <Default_Option1@plt>
jmp    134c <Grep_dir+0x1ac>
mov    -0x38(%rbp),%rax
mov    (%rax),%rdi
call   10c0 <text_or_binary@plt>
cmp    $0x0,%eax
jne    1342 <Grep_dir+0x1a2>
mov    -0x38(%rbp),%rax
mov    (%rax),%rsi
lea    0xcd1(%rip),%rdi
call   1060 <printf@plt>
jmp    1347 <Grep_dir+0x1a7>
jmp    13a4 <Grep_dir+0x204>
jmp    134c <Grep_dir+0x1ac>
jmp    1390 <Grep_dir+0x1f0>
mov    -0x38(%rbp),%rax
mov    0x8(%rax),%rax
mov    0x2c78(%rip),%rcx
cmp    (%rcx),%rax
jne    1386 <Grep_dir+0x1e6>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x38(%rbp),%rax
mov    (%rax),%rdx
mov    -0x28(%rbp),%rcx
call   1030 <Grep_dir@plt>
jmp    138b <Grep_dir+0x1eb>
jmp    13a4 <Grep_dir+0x204>
jmp    1390 <Grep_dir+0x1f0>
jmp    1395 <Grep_dir+0x1f5>
jmp    139f <Grep_dir+0x1ff>
jmp    13a4 <Grep_dir+0x204>
jmp    13a4 <Grep_dir+0x204>
mov    -0x30(%rbp),%rdi
call   1090 <readdir@plt>
mov    %rax,-0x38(%rbp)
cmp    $0x0,%rax
jne    1260 <Grep_dir+0xc0>
lea    0xc44(%rip),%rdi
call   1050 <chdir@plt>
jmp    1516 <Grep_dir+0x376>
mov    -0x28(%rbp),%rdi
lea    0xc4a(%rip),%rsi
call   1080 <strcmp@plt>
cmp    $0x0,%rax
jne    1511 <Grep_dir+0x371>
jmp    13eb <Grep_dir+0x24b>
mov    -0x38(%rbp),%rax
mov    (%rax),%rdi
lea    0xc0e(%rip),%rsi
call   1080 <strcmp@plt>
cmp    $0x0,%rax
je     14eb <Grep_dir+0x34b>
mov    -0x38(%rbp),%rax
mov    (%rax),%rdi
lea    0xbf0(%rip),%rsi
call   1080 <strcmp@plt>
cmp    $0x0,%rax
je     14eb <Grep_dir+0x34b>
mov    -0x38(%rbp),%rax
mov    0x8(%rax),%rax
mov    0x2ba4(%rip),%rcx
cmp    (%rcx),%rax
je     145a <Grep_dir+0x2ba>
mov    -0x38(%rbp),%rax
mov    0x8(%rax),%rax
mov    0x2b94(%rip),%rcx
cmp    (%rcx),%rax
je     145a <Grep_dir+0x2ba>
jmp    14f5 <Grep_dir+0x355>
mov    -0x38(%rbp),%rax
mov    0x8(%rax),%rax
mov    0x2b77(%rip),%rcx
cmp    (%rcx),%rax
jne    14dc <Grep_dir+0x33c>
mov    -0x38(%rbp),%rax
mov    (%rax),%rdi
call   10c0 <text_or_binary@plt>
cmp    $0x1,%eax
jne    14a0 <Grep_dir+0x300>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x38(%rbp),%rax
mov    (%rax),%rdx
call   10a0 <Default_Option1@plt>
jmp    14d7 <Grep_dir+0x337>
mov    -0x38(%rbp),%rax
mov    (%rax),%rdi
call   10c0 <text_or_binary@plt>
cmp    $0x0,%eax
jne    14cd <Grep_dir+0x32d>
mov    -0x38(%rbp),%rax
mov    (%rax),%rsi
lea    0xb46(%rip),%rdi
call   1060 <printf@plt>
jmp    14d2 <Grep_dir+0x332>
jmp    14f5 <Grep_dir+0x355>
jmp    14d7 <Grep_dir+0x337>
jmp    14e1 <Grep_dir+0x341>
jmp    14f5 <Grep_dir+0x355>
jmp    14e6 <Grep_dir+0x346>
jmp    14f0 <Grep_dir+0x350>
jmp    14f5 <Grep_dir+0x355>
jmp    14f5 <Grep_dir+0x355>
mov    -0x30(%rbp),%rdi
call   1090 <readdir@plt>
mov    %rax,-0x38(%rbp)
cmp    $0x0,%rax
jne    13eb <Grep_dir+0x24b>
jmp    1511 <Grep_dir+0x371>
jmp    1516 <Grep_dir+0x376>
mov    -0x30(%rbp),%rdi
call   1070 <closedir@plt>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Grep_dir>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %rcx,%rbp
mov    %rdx,%r13
mov    %rsi,0x10(%rsp)
mov    %rdi,0x8(%rsp)
mov    %rdx,%rdi
call   1040 <opendir@plt>
test   %rax,%rax
je     13cd <Grep_dir+0x22d>
mov    %rax,%r12
mov    %rax,%rdi
call   1090 <readdir@plt>
test   %rax,%rax
je     13cd <Grep_dir+0x22d>
mov    %rax,%rbx
test   %rbp,%rbp
je     12c5 <Grep_dir+0x125>
lea    0xe2b(%rip),%rsi
mov    %rbp,%rdi
call   1080 <strcmp@plt>
test   %rax,%rax
jne    13b4 <Grep_dir+0x214>
lea    0xdf9(%rip),%rbp
lea    0xdf1(%rip),%r13
mov    0x2dbc(%rip),%r14
mov    0x2dbd(%rip),%r15
jmp    1254 <Grep_dir+0xb4>
mov    0x8(%rsp),%rdi
mov    0x10(%rsp),%rsi
call   10a0 <Default_Option1@plt>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r12,%rdi
call   1090 <readdir@plt>
mov    %rax,%rbx
test   %rax,%rax
je     13b4 <Grep_dir+0x214>
mov    (%rbx),%rdi
mov    %rbp,%rsi
call   1080 <strcmp@plt>
test   %rax,%rax
je     1240 <Grep_dir+0xa0>
mov    (%rbx),%rdi
mov    %r13,%rsi
call   1080 <strcmp@plt>
test   %rax,%rax
je     1240 <Grep_dir+0xa0>
mov    0x8(%rbx),%rax
cmp    (%r14),%rax
sete   %sil
mov    (%r15),%rcx
cmp    %rcx,%rax
sete   %dl
or     %sil,%dl
cmp    $0x1,%dl
jne    1240 <Grep_dir+0xa0>
cmp    %rcx,%rax
jne    1240 <Grep_dir+0xa0>
mov    (%rbx),%rdi
call   10c0 <text_or_binary@plt>
mov    (%rbx),%rdx
cmp    $0x1,%eax
je     1225 <Grep_dir+0x85>
mov    %rdx,%rdi
call   10c0 <text_or_binary@plt>
test   %eax,%eax
jne    1240 <Grep_dir+0xa0>
mov    (%rbx),%rsi
lea    0xd4e(%rip),%rdi
call   1060 <printf@plt>
jmp    1240 <Grep_dir+0xa0>
mov    %r13,%rdi
call   1050 <chdir@plt>
test   %rax,%rax
jne    13cd <Grep_dir+0x22d>
lea    0xd2a(%rip),%r13
lea    0xd22(%rip),%rbp
mov    0x2ced(%rip),%r14
mov    0x2cee(%rip),%r15
jmp    1324 <Grep_dir+0x184>
mov    0x8(%rsp),%rdi
mov    0x10(%rsp),%rsi
call   10a0 <Default_Option1@plt>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %r12,%rdi
call   1090 <readdir@plt>
mov    %rax,%rbx
test   %rax,%rax
je     13a8 <Grep_dir+0x208>
mov    (%rbx),%rdi
mov    %r13,%rsi
call   1080 <strcmp@plt>
test   %rax,%rax
je     1310 <Grep_dir+0x170>
mov    (%rbx),%rdi
mov    %rbp,%rsi
call   1080 <strcmp@plt>
test   %rax,%rax
je     1310 <Grep_dir+0x170>
mov    0x8(%rbx),%rax
mov    (%r14),%rcx
mov    (%r15),%rdx
cmp    %rcx,%rax
je     1358 <Grep_dir+0x1b8>
cmp    %rdx,%rax
jne    1310 <Grep_dir+0x170>
cmp    %rdx,%rax
jne    138a <Grep_dir+0x1ea>
mov    (%rbx),%rdi
call   10c0 <text_or_binary@plt>
mov    (%rbx),%rdx
cmp    $0x1,%eax
je     12f4 <Grep_dir+0x154>
mov    %rdx,%rdi
call   10c0 <text_or_binary@plt>
test   %eax,%eax
jne    1310 <Grep_dir+0x170>
mov    (%rbx),%rsi
lea    0xc86(%rip),%rdi
call   1060 <printf@plt>
jmp    1310 <Grep_dir+0x170>
cmp    %rcx,%rax
jne    1310 <Grep_dir+0x170>
mov    (%rbx),%rdx
mov    0x8(%rsp),%rdi
mov    0x10(%rsp),%rsi
xor    %ecx,%ecx
call   1030 <Grep_dir@plt>
jmp    1310 <Grep_dir+0x170>
lea    0xc57(%rip),%rdi
call   1050 <chdir@plt>
mov    %r12,%rdi
call   1070 <closedir@plt>
xor    %eax,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0xc2c(%rip),%rdi
call   10b0 <perror@plt>
mov    0x2bf0(%rip),%rax
mov    (%rax),%eax
jmp    13be <Grep_dir+0x21e>

LLVM IR (-O0):
%struct.dirent = type { i8*, i64 }
@.str = [6 x i8] c"Error\00"
@errno = global i32 0
@.str.1 = [2 x i8] c".\00"
@.str.2 = [3 x i8] c"..\00"
@DT_DIR = global i64 0
@DT_REG = global i64 0
@.str.3 = [24 x i8] c"Binary file %s matches\0A\00"
@.str.4 = [2 x i8] c"*\00"
define i32 @Grep_dir(i8* %0, i8* %1, i8* %2, i8* %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i32*
%11 = alloca %struct.dirent*
store i8* %0, i8** %6
store i8* %1, i8** %7
store i8* %2, i8** %8
store i8* %3, i8** %9
%12 = load i8*, i8** %8
%13 = call i32* @opendir(i8* %12)
store i32* %13, i32** %10
%14 = icmp ne i32* %13, null
br i1 %14, label %18, label %15
15: ; preds = %4
%16 = call i32 @perror(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%17 = load i32, i32* @errno
store i32 %17, i32* %5
br label %197
18: ; preds = %4
%19 = load i32*, i32** %10
%20 = call %struct.dirent* @readdir(i32* %19)
store %struct.dirent* %20, %struct.dirent** %11
%21 = icmp ne %struct.dirent* %20, null
br i1 %21, label %25, label %22
22: ; preds = %18
%23 = call i32 @perror(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%24 = load i32, i32* @errno
store i32 %24, i32* %5
br label %197
25: ; preds = %18
%26 = load i8*, i8** %9
%27 = icmp eq i8* %26, null
br i1 %27, label %28, label %120
28: ; preds = %25
%29 = load i8*, i8** %8
%30 = call i64 @chdir(i8* %29)
%31 = icmp ne i64 %30, 0
br i1 %31, label %32, label %35
32: ; preds = %28
%33 = call i32 @perror(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%34 = load i32, i32* @errno
store i32 %34, i32* %5
br label %197
35: ; preds = %28
br label %36
36: ; preds = %114, %35
%37 = load %struct.dirent*, %struct.dirent** %11
%38 = getelementptr inbounds %struct.dirent, %struct.dirent* %37, i32 0, i32 0
%39 = load i8*, i8** %38
%40 = call i64 @strcmp(i8* %39, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%41 = icmp ne i64 %40, 0
br i1 %41, label %42, label %112
42: ; preds = %36
%43 = load %struct.dirent*, %struct.dirent** %11
%44 = getelementptr inbounds %struct.dirent, %struct.dirent* %43, i32 0, i32 0
%45 = load i8*, i8** %44
%46 = call i64 @strcmp(i8* %45, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0))
%47 = icmp ne i64 %46, 0
br i1 %47, label %48, label %112
48: ; preds = %42
%49 = load %struct.dirent*, %struct.dirent** %11
%50 = getelementptr inbounds %struct.dirent, %struct.dirent* %49, i32 0, i32 1
%51 = load i64, i64* %50
%52 = load i64, i64* @DT_DIR
%53 = icmp ne i64 %51, %52
br i1 %53, label %54, label %61
54: ; preds = %48
%55 = load %struct.dirent*, %struct.dirent** %11
%56 = getelementptr inbounds %struct.dirent, %struct.dirent* %55, i32 0, i32 1
%57 = load i64, i64* %56
%58 = load i64, i64* @DT_REG
%59 = icmp ne i64 %57, %58
br i1 %59, label %60, label %61
60: ; preds = %54
br label %114
61: ; preds = %54, %48
%62 = load %struct.dirent*, %struct.dirent** %11
%63 = getelementptr inbounds %struct.dirent, %struct.dirent* %62, i32 0, i32 1
%64 = load i64, i64* %63
%65 = load i64, i64* @DT_REG
%66 = icmp eq i64 %64, %65
br i1 %66, label %67, label %94
67: ; preds = %61
%68 = load %struct.dirent*, %struct.dirent** %11
%69 = getelementptr inbounds %struct.dirent, %struct.dirent* %68, i32 0, i32 0
%70 = load i8*, i8** %69
%71 = call i32 @text_or_binary(i8* %70)
%72 = icmp eq i32 %71, 1
br i1 %72, label %73, label %80
73: ; preds = %67
%74 = load i8*, i8** %6
%75 = load i8*, i8** %7
%76 = load %struct.dirent*, %struct.dirent** %11
%77 = getelementptr inbounds %struct.dirent, %struct.dirent* %76, i32 0, i32 0
%78 = load i8*, i8** %77
%79 = call i32 @Default_Option1(i8* %74, i8* %75, i8* %78)
br label %93
80: ; preds = %67
%81 = load %struct.dirent*, %struct.dirent** %11
%82 = getelementptr inbounds %struct.dirent, %struct.dirent* %81, i32 0, i32 0
%83 = load i8*, i8** %82
%84 = call i32 @text_or_binary(i8* %83)
%85 = icmp eq i32 %84, 0
br i1 %85, label %86, label %91
86: ; preds = %80
%87 = load %struct.dirent*, %struct.dirent** %11
%88 = getelementptr inbounds %struct.dirent, %struct.dirent* %87, i32 0, i32 0
%89 = load i8*, i8** %88
%90 = call i32 @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.3, i64 0, i64 0), i8* %89)
br label %92
91: ; preds = %80
br label %114
92: ; preds = %86
br label %93
93: ; preds = %92, %73
br label %110
94: ; preds = %61
%95 = load %struct.dirent*, %struct.dirent** %11
%96 = getelementptr inbounds %struct.dirent, %struct.dirent* %95, i32 0, i32 1
%97 = load i64, i64* %96
%98 = load i64, i64* @DT_DIR
%99 = icmp eq i64 %97, %98
br i1 %99, label %100, label %108
100: ; preds = %94
%101 = load i8*, i8** %6
%102 = load i8*, i8** %7
%103 = load %struct.dirent*, %struct.dirent** %11
%104 = getelementptr inbounds %struct.dirent, %struct.dirent* %103, i32 0, i32 0
%105 = load i8*, i8** %104
%106 = load i8*, i8** %9
%107 = call i32 @Grep_dir(i8* %101, i8* %102, i8* %105, i8* %106)
br label %109
108: ; preds = %94
br label %114
109: ; preds = %100
br label %110
110: ; preds = %109, %93
br label %111
111: ; preds = %110
br label %113
112: ; preds = %42, %36
br label %114
113: ; preds = %111
br label %114
114: ; preds = %113, %112, %108, %91, %60
%115 = load i32*, i32** %10
%116 = call %struct.dirent* @readdir(i32* %115)
store %struct.dirent* %116, %struct.dirent** %11
%117 = icmp ne %struct.dirent* %116, null
br i1 %117, label %36, label %118
118: ; preds = %114
%119 = call i64 @chdir(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0))
br label %194
120: ; preds = %25
%121 = load i8*, i8** %9
%122 = call i64 @strcmp(i8* %121, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.4, i64 0, i64 0))
%123 = icmp ne i64 %122, 0
br i1 %123, label %193, label %124
124: ; preds = %120
br label %125
125: ; preds = %188, %124
%126 = load %struct.dirent*, %struct.dirent** %11
%127 = getelementptr inbounds %struct.dirent, %struct.dirent* %126, i32 0, i32 0
%128 = load i8*, i8** %127
%129 = call i64 @strcmp(i8* %128, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%130 = icmp ne i64 %129, 0
br i1 %130, label %131, label %186
131: ; preds = %125
%132 = load %struct.dirent*, %struct.dirent** %11
%133 = getelementptr inbounds %struct.dirent, %struct.dirent* %132, i32 0, i32 0
%134 = load i8*, i8** %133
%135 = call i64 @strcmp(i8* %134, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0))
%136 = icmp ne i64 %135, 0
br i1 %136, label %137, label %186
137: ; preds = %131
%138 = load %struct.dirent*, %struct.dirent** %11
%139 = getelementptr inbounds %struct.dirent, %struct.dirent* %138, i32 0, i32 1
%140 = load i64, i64* %139
%141 = load i64, i64* @DT_DIR
%142 = icmp ne i64 %140, %141
br i1 %142, label %143, label %150
143: ; preds = %137
%144 = load %struct.dirent*, %struct.dirent** %11
%145 = getelementptr inbounds %struct.dirent, %struct.dirent* %144, i32 0, i32 1
%146 = load i64, i64* %145
%147 = load i64, i64* @DT_REG
%148 = icmp ne i64 %146, %147
br i1 %148, label %149, label %150
149: ; preds = %143
br label %188
150: ; preds = %143, %137
%151 = load %struct.dirent*, %struct.dirent** %11
%152 = getelementptr inbounds %struct.dirent, %struct.dirent* %151, i32 0, i32 1
%153 = load i64, i64* %152
%154 = load i64, i64* @DT_REG
%155 = icmp eq i64 %153, %154
br i1 %155, label %156, label %183
156: ; preds = %150
%157 = load %struct.dirent*, %struct.dirent** %11
%158 = getelementptr inbounds %struct.dirent, %struct.dirent* %157, i32 0, i32 0
%159 = load i8*, i8** %158
%160 = call i32 @text_or_binary(i8* %159)
%161 = icmp eq i32 %160, 1
br i1 %161, label %162, label %169
162: ; preds = %156
%163 = load i8*, i8** %6
%164 = load i8*, i8** %7
%165 = load %struct.dirent*, %struct.dirent** %11
%166 = getelementptr inbounds %struct.dirent, %struct.dirent* %165, i32 0, i32 0
%167 = load i8*, i8** %166
%168 = call i32 @Default_Option1(i8* %163, i8* %164, i8* %167)
br label %182
169: ; preds = %156
%170 = load %struct.dirent*, %struct.dirent** %11
%171 = getelementptr inbounds %struct.dirent, %struct.dirent* %170, i32 0, i32 0
%172 = load i8*, i8** %171
%173 = call i32 @text_or_binary(i8* %172)
%174 = icmp eq i32 %173, 0
br i1 %174, label %175, label %180
175: ; preds = %169
%176 = load %struct.dirent*, %struct.dirent** %11
%177 = getelementptr inbounds %struct.dirent, %struct.dirent* %176, i32 0, i32 0
%178 = load i8*, i8** %177
%179 = call i32 @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.3, i64 0, i64 0), i8* %178)
br label %181
180: ; preds = %169
br label %188
181: ; preds = %175
br label %182
182: ; preds = %181, %162
br label %184
183: ; preds = %150
br label %188
184: ; preds = %182
br label %185
185: ; preds = %184
br label %187
186: ; preds = %131, %125
br label %188
187: ; preds = %185
br label %188
188: ; preds = %187, %186, %183, %180, %149
%189 = load i32*, i32** %10
%190 = call %struct.dirent* @readdir(i32* %189)
store %struct.dirent* %190, %struct.dirent** %11
%191 = icmp ne %struct.dirent* %190, null
br i1 %191, label %125, label %192
192: ; preds = %188
br label %193
193: ; preds = %192, %120
br label %194
194: ; preds = %193, %118
%195 = load i32*, i32** %10
%196 = call i32 @closedir(i32* %195)
store i32 0, i32* %5
br label %197
197: ; preds = %194, %32, %22, %15
%198 = load i32, i32* %5
ret i32 %198
}

LLVM IR (-O2):
%struct.dirent = type { i8*, i64 }
@.str = [6 x i8] c"Error\00"
@errno = global i32 0
@.str.1 = [2 x i8] c".\00"
@.str.2 = [3 x i8] c"..\00"
@DT_DIR = global i64 0
@DT_REG = global i64 0
@.str.3 = [24 x i8] c"Binary file %s matches\0A\00"
@.str.4 = [2 x i8] c"*\00"
define i32 @Grep_dir(i8* %0, i8* %1, i8* %2, i8* %3) {
%5 = tail call i32* @opendir(i8* %2)
%6 = icmp eq i32* %5, null
br i1 %6, label %7, label %10
7: ; preds = %4
%8 = tail call i32 @perror(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%9 = load i32, i32* @errno
br label %105
10: ; preds = %4
%11 = tail call %struct.dirent* @readdir(i32* %5)
%12 = icmp eq %struct.dirent* %11, null
br i1 %12, label %13, label %16
13: ; preds = %10
%14 = tail call i32 @perror(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%15 = load i32, i32* @errno
br label %105
16: ; preds = %10
%17 = icmp eq i8* %3, null
br i1 %17, label %18, label %65
18: ; preds = %16
%19 = tail call i64 @chdir(i8* %2)
%20 = icmp eq i64 %19, 0
br i1 %20, label %24, label %21
21: ; preds = %18
%22 = tail call i32 @perror(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str, i64 0, i64 0))
%23 = load i32, i32* @errno
br label %105
24: ; preds = %18, %60
%25 = phi %struct.dirent* [ %61, %60 ], [ %11, %18 ]
%26 = getelementptr inbounds %struct.dirent, %struct.dirent* %25, i64 0, i32 0
%27 = load i8*, i8** %26
%28 = tail call i64 @strcmp(i8* %27, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%29 = icmp eq i64 %28, 0
br i1 %29, label %60, label %30
30: ; preds = %24
%31 = load i8*, i8** %26
%32 = tail call i64 @strcmp(i8* %31, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0))
%33 = icmp eq i64 %32, 0
br i1 %33, label %60, label %34
34: ; preds = %30
%35 = getelementptr inbounds %struct.dirent, %struct.dirent* %25, i64 0, i32 1
%36 = load i64, i64* %35
%37 = load i64, i64* @DT_DIR
%38 = icmp eq i64 %36, %37
%39 = load i64, i64* @DT_REG
%40 = icmp eq i64 %36, %39
%41 = select i1 %38, i1 true, i1 %40
br i1 %41, label %42, label %60
42: ; preds = %34
br i1 %40, label %43, label %56
43: ; preds = %42
%44 = load i8*, i8** %26
%45 = tail call i32 @text_or_binary(i8* %44)
%46 = icmp eq i32 %45, 1
%47 = load i8*, i8** %26
br i1 %46, label %48, label %50
48: ; preds = %43
%49 = tail call i32 @Default_Option1(i8* %0, i8* %1, i8* %47)
br label %60
50: ; preds = %43
%51 = tail call i32 @text_or_binary(i8* %47)
%52 = icmp eq i32 %51, 0
br i1 %52, label %53, label %60
53: ; preds = %50
%54 = load i8*, i8** %26
%55 = tail call i32 @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.3, i64 0, i64 0), i8* %54)
br label %60
56: ; preds = %42
br i1 %38, label %57, label %60
57: ; preds = %56
%58 = load i8*, i8** %26
%59 = tail call i32 @Grep_dir(i8* %0, i8* %1, i8* %58, i8* null)
br label %60
60: ; preds = %34, %57, %53, %48, %24, %30, %56, %50
%61 = tail call %struct.dirent* @readdir(i32* %5)
%62 = icmp eq %struct.dirent* %61, null
br i1 %62, label %63, label %24
63: ; preds = %60
%64 = tail call i64 @chdir(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0))
br label %103
65: ; preds = %16
%66 = tail call i64 @strcmp(i8* %3, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.4, i64 0, i64 0))
%67 = icmp eq i64 %66, 0
br i1 %67, label %68, label %103
68: ; preds = %65, %100
%69 = phi %struct.dirent* [ %101, %100 ], [ %11, %65 ]
%70 = getelementptr inbounds %struct.dirent, %struct.dirent* %69, i64 0, i32 0
%71 = load i8*, i8** %70
%72 = tail call i64 @strcmp(i8* %71, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%73 = icmp eq i64 %72, 0
br i1 %73, label %100, label %74
74: ; preds = %68
%75 = load i8*, i8** %70
%76 = tail call i64 @strcmp(i8* %75, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0))
%77 = icmp eq i64 %76, 0
br i1 %77, label %100, label %78
78: ; preds = %74
%79 = getelementptr inbounds %struct.dirent, %struct.dirent* %69, i64 0, i32 1
%80 = load i64, i64* %79
%81 = load i64, i64* @DT_DIR
%82 = icmp eq i64 %80, %81
%83 = load i64, i64* @DT_REG
%84 = icmp eq i64 %80, %83
%85 = select i1 %82, i1 true, i1 %84
%86 = select i1 %85, i1 %84, i1 false
br i1 %86, label %87, label %100
87: ; preds = %78
%88 = load i8*, i8** %70
%89 = tail call i32 @text_or_binary(i8* %88)
%90 = icmp eq i32 %89, 1
%91 = load i8*, i8** %70
br i1 %90, label %92, label %94
92: ; preds = %87
%93 = tail call i32 @Default_Option1(i8* %0, i8* %1, i8* %91)
br label %100
94: ; preds = %87
%95 = tail call i32 @text_or_binary(i8* %91)
%96 = icmp eq i32 %95, 0
br i1 %96, label %97, label %100
97: ; preds = %94
%98 = load i8*, i8** %70
%99 = tail call i32 @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.3, i64 0, i64 0), i8* %98)
br label %100
100: ; preds = %78, %97, %92, %68, %74, %94
%101 = tail call %struct.dirent* @readdir(i32* %5)
%102 = icmp eq %struct.dirent* %101, null
br i1 %102, label %103, label %68
103: ; preds = %100, %65, %63
%104 = tail call i32 @closedir(i32* %5)
br label %105
105: ; preds = %103, %21, %13, %7
%106 = phi i32 [ %23, %21 ], [ 0, %103 ], [ %15, %13 ], [ %9, %7 ]
ret i32 %106
}