#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 */

/* Variables and functions */
int O_CREAT;
int O_RDWR;
int O_TRUNC;
int S_IRUSR;
int S_IWUSR;
int /*<<< orphan*/ _exit(int);
int /*<<< orphan*/ close(int);
int /*<<< orphan*/ dup2(int, int);
int open(char *, int, int);
int /*<<< orphan*/ perror(char *);
scalar_t__ strcmp(char *, char *);
void handle_redir(int count, char *argv[]) {
  int fd, out_redir = 0, in_redir = 0;
  int i;
  for (i = 0; i < count; i++) {
    if (strcmp(argv[i], ">") == 0) {
      if (out_redir != 0) {
        perror("ERROR: Cannot output to more than one file.\n");
        _exit(-1);
      } else if (i == 0) {
        perror("ERROR: No Command Entered.\n");
        _exit(-1);
      }
      out_redir = i;
    } else if (strcmp(argv[i], "<") == 0) {
      if (in_redir != 0) {
        perror("ERROR: Cannot input from more than one file.\n");
        _exit(-1);
      } else if (i == 0) {
        perror("ERROR: No Command Entered.\n");
        _exit(-1);
      }
      in_redir = i;
    }
  }
  if (out_redir != 0) {
    if (argv[out_redir + 1] == NULL) {
      perror("ERROR: No file.\n");
      _exit(-1);
    }
    fd = open(argv[out_redir + 1], O_RDWR | O_CREAT | O_TRUNC,
              S_IRUSR | S_IWUSR);
    if (fd < 0) {
      perror("ERROR: No file. 1\n");
      _exit(-1);
    }
    dup2(fd, 1);
    close(fd);
    argv[out_redir] = NULL;
  }
  if (in_redir != 0) {
    if (argv[in_redir + 1] == NULL) {
      perror("ERROR: No file. 2\n");
      _exit(-1);
    }
    fd = open(argv[out_redir + 1], O_RDWR | O_CREAT | O_TRUNC,
              S_IRUSR | S_IWUSR);
    if (fd < 0) {
      perror("ERROR: No file.\n");
      _exit(-1);
    }
    dup2(fd, 0);
    close(fd);
    argv[in_redir] = NULL;
  }
}


x86 assembly (clang, -O0):
<handle_redir>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1287 <handle_redir+0x127>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xe5d(%rip),%rsi
call   1060 <strcmp@plt>
cmp    $0x0,%rax
jne    1202 <handle_redir+0xa2>
cmpl   $0x0,-0x18(%rbp)
je     11d2 <handle_redir+0x72>
lea    0xe3f(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>
cmpl   $0x0,-0x20(%rbp)
jne    11f2 <handle_redir+0x92>
lea    0xe4c(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>
jmp    11f7 <handle_redir+0x97>
mov    -0x20(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1274 <handle_redir+0x114>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
lea    0xe36(%rip),%rsi
call   1060 <strcmp@plt>
cmp    $0x0,%rax
jne    126f <handle_redir+0x10f>
cmpl   $0x0,-0x1c(%rbp)
je     1244 <handle_redir+0xe4>
lea    0xe18(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>
cmpl   $0x0,-0x20(%rbp)
jne    1264 <handle_redir+0x104>
lea    0xdda(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>
jmp    1269 <handle_redir+0x109>
mov    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1274 <handle_redir+0x114>
jmp    1279 <handle_redir+0x119>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1184 <handle_redir+0x24>
cmpl   $0x0,-0x18(%rbp)
je     134a <handle_redir+0x1ea>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpq   $0x0,(%rax,%rcx,8)
jne    12bf <handle_redir+0x15f>
lea    0xdcb(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdi
mov    0x2d01(%rip),%rax
mov    (%rax),%esi
mov    0x2d18(%rip),%rax
or     (%rax),%esi
mov    0x2d07(%rip),%rax
or     (%rax),%esi
mov    0x2cce(%rip),%rax
mov    (%rax),%edx
mov    0x2cd5(%rip),%rax
or     (%rax),%edx
call   1070 <open@plt>
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jge    1325 <handle_redir+0x1c5>
lea    0xd76(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>
mov    -0x14(%rbp),%edi
mov    $0x1,%esi
call   1040 <dup2@plt>
mov    -0x14(%rbp),%edi
call   1050 <close@plt>
mov    -0x10(%rbp),%rax
movslq -0x18(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
cmpl   $0x0,-0x1c(%rbp)
je     140a <handle_redir+0x2aa>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmpq   $0x0,(%rax,%rcx,8)
jne    1382 <handle_redir+0x222>
lea    0xd2c(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rdi
mov    0x2c3e(%rip),%rax
mov    (%rax),%esi
mov    0x2c55(%rip),%rax
or     (%rax),%esi
mov    0x2c44(%rip),%rax
or     (%rax),%esi
mov    0x2c0b(%rip),%rax
mov    (%rax),%edx
mov    0x2c12(%rip),%rax
or     (%rax),%edx
call   1070 <open@plt>
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jge    13e8 <handle_redir+0x288>
lea    0xca2(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>
mov    -0x14(%rbp),%edi
xor    %esi,%esi
call   1040 <dup2@plt>
mov    -0x14(%rbp),%edi
call   1050 <close@plt>
mov    -0x10(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movq   $0x0,(%rax,%rcx,8)
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<handle_redir>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
test   %edi,%edi
jle    1303 <handle_redir+0x1a3>
mov    %rsi,%rbx
mov    %edi,%ebp
mov    (%rsi),%rdi
lea    0xe7e(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1324 <handle_redir+0x1c4>
mov    (%rbx),%rdi
lea    0xeb1(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1324 <handle_redir+0x1c4>
cmp    $0x1,%ebp
je     1303 <handle_redir+0x1a3>
mov    %ebp,%ebp
xor    %r12d,%r12d
mov    $0x1,%r15d
lea    0xe3d(%rip),%r14
xor    %r13d,%r13d
jmp    11dc <handle_redir+0x7c>
nopl   0x0(%rax,%rax,1)
mov    %r15d,%r12d
add    $0x1,%r15
cmp    %r15,%rbp
je     121e <handle_redir+0xbe>
mov    (%rbx,%r15,8),%rdi
mov    %r14,%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
je     1210 <handle_redir+0xb0>
mov    (%rbx,%r15,8),%rdi
lea    0xe53(%rip),%rsi
call   1060 <strcmp@plt>
test   %rax,%rax
jne    11d3 <handle_redir+0x73>
test   %r12d,%r12d
je     11d0 <handle_redir+0x70>
jmp    131b <handle_redir+0x1bb>
nopl   0x0(%rax)
test   %r13d,%r13d
jne    1312 <handle_redir+0x1b2>
mov    %r15d,%r13d
jmp    11d3 <handle_redir+0x73>
test   %r13d,%r13d
je     1294 <handle_redir+0x134>
movslq %r13d,%rbp
mov    0x8(%rbx,%rbp,8),%rdi
test   %rdi,%rdi
je     132d <handle_redir+0x1cd>
mov    0x2d9d(%rip),%rax
mov    0x2db6(%rip),%rcx
mov    (%rcx),%esi
or     (%rax),%esi
mov    0x2da3(%rip),%rax
or     (%rax),%esi
mov    0x2d6a(%rip),%rax
mov    0x2d73(%rip),%rcx
mov    (%rcx),%edx
or     (%rax),%edx
call   1070 <open@plt>
test   %eax,%eax
js     1336 <handle_redir+0x1d6>
mov    %eax,%r14d
mov    %eax,%edi
mov    $0x1,%esi
call   1040 <dup2@plt>
mov    %r14d,%edi
call   1050 <close@plt>
movq   $0x0,(%rbx,%rbp,8)
test   %r12d,%r12d
jne    129c <handle_redir+0x13c>
jmp    1303 <handle_redir+0x1a3>
xor    %r13d,%r13d
test   %r12d,%r12d
je     1303 <handle_redir+0x1a3>
movslq %r12d,%r14
cmpq   $0x0,0x8(%rbx,%r14,8)
je     133f <handle_redir+0x1df>
movslq %r13d,%rax
mov    0x8(%rbx,%rax,8),%rdi
mov    0x2d1e(%rip),%rax
mov    0x2d37(%rip),%rcx
mov    (%rcx),%esi
or     (%rax),%esi
mov    0x2d24(%rip),%rax
or     (%rax),%esi
mov    0x2ceb(%rip),%rax
mov    0x2cf4(%rip),%rcx
mov    (%rcx),%edx
or     (%rax),%edx
call   1070 <open@plt>
test   %eax,%eax
js     132d <handle_redir+0x1cd>
mov    %eax,%ebp
mov    %eax,%edi
xor    %esi,%esi
call   1040 <dup2@plt>
mov    %ebp,%edi
call   1050 <close@plt>
movq   $0x0,(%rbx,%r14,8)
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    0xce9(%rip),%rdi
jmp    1346 <handle_redir+0x1e6>
lea    0xd2b(%rip),%rdi
jmp    1346 <handle_redir+0x1e6>
lea    0xd04(%rip),%rdi
jmp    1346 <handle_redir+0x1e6>
lea    0xd47(%rip),%rdi
jmp    1346 <handle_redir+0x1e6>
lea    0xd4f(%rip),%rdi
jmp    1346 <handle_redir+0x1e6>
lea    0xd59(%rip),%rdi
call   1080 <perror@plt>
mov    $0xffffffff,%edi
call   1030 <_exit@plt>

LLVM IR (-O0):
@.str = [2 x i8] c">\00"
@.str.1 = [45 x i8] c"ERROR: Cannot output to more than one file.\0A\00"
@.str.2 = [28 x i8] c"ERROR: No Command Entered.\0A\00"
@.str.3 = [2 x i8] c"<\00"
@.str.4 = [46 x i8] c"ERROR: Cannot input from more than one file.\0A\00"
@.str.5 = [17 x i8] c"ERROR: No file.\0A\00"
@O_RDWR = global i32 0
@O_CREAT = global i32 0
@O_TRUNC = global i32 0
@S_IRUSR = global i32 0
@S_IWUSR = global i32 0
@.str.6 = [19 x i8] c"ERROR: No file. 1\0A\00"
@.str.7 = [19 x i8] c"ERROR: No file. 2\0A\00"
define void @handle_redir(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i8**
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
store i32 %0, i32* %3
store i8** %1, i8*** %4
store i32 0, i32* %6
store i32 0, i32* %7
store i32 0, i32* %8
br label %9
9: ; preds = %61, %2
%10 = load i32, i32* %8
%11 = load i32, i32* %3
%12 = icmp slt i32 %10, %11
br i1 %12, label %13, label %64
13: ; preds = %9
%14 = load i8**, i8*** %4
%15 = load i32, i32* %8
%16 = sext i32 %15 to i64
%17 = getelementptr inbounds i8*, i8** %14, i64 %16
%18 = load i8*, i8** %17
%19 = call i64 @strcmp(i8* %18, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%20 = icmp eq i64 %19, 0
br i1 %20, label %21, label %36
21: ; preds = %13
%22 = load i32, i32* %6
%23 = icmp ne i32 %22, 0
br i1 %23, label %24, label %27
24: ; preds = %21
%25 = call i32 @perror(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.1, i64 0, i64 0))
%26 = call i32 @_exit(i32 -1)
unreachable
27: ; preds = %21
%28 = load i32, i32* %8
%29 = icmp eq i32 %28, 0
br i1 %29, label %30, label %33
30: ; preds = %27
%31 = call i32 @perror(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.2, i64 0, i64 0))
%32 = call i32 @_exit(i32 -1)
unreachable
33: ; preds = %27
br label %34
34: ; preds = %33
%35 = load i32, i32* %8
store i32 %35, i32* %6
br label %60
36: ; preds = %13
%37 = load i8**, i8*** %4
%38 = load i32, i32* %8
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8*, i8** %37, i64 %39
%41 = load i8*, i8** %40
%42 = call i64 @strcmp(i8* %41, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i64 0, i64 0))
%43 = icmp eq i64 %42, 0
br i1 %43, label %44, label %59
44: ; preds = %36
%45 = load i32, i32* %7
%46 = icmp ne i32 %45, 0
br i1 %46, label %47, label %50
47: ; preds = %44
%48 = call i32 @perror(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.4, i64 0, i64 0))
%49 = call i32 @_exit(i32 -1)
unreachable
50: ; preds = %44
%51 = load i32, i32* %8
%52 = icmp eq i32 %51, 0
br i1 %52, label %53, label %56
53: ; preds = %50
%54 = call i32 @perror(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.2, i64 0, i64 0))
%55 = call i32 @_exit(i32 -1)
unreachable
56: ; preds = %50
br label %57
57: ; preds = %56
%58 = load i32, i32* %8
store i32 %58, i32* %7
br label %59
59: ; preds = %57, %36
br label %60
60: ; preds = %59, %34
br label %61
61: ; preds = %60
%62 = load i32, i32* %8
%63 = add nsw i32 %62, 1
store i32 %63, i32* %8
br label %9
64: ; preds = %9
%65 = load i32, i32* %6
%66 = icmp ne i32 %65, 0
br i1 %66, label %67, label %108
67: ; preds = %64
%68 = load i8**, i8*** %4
%69 = load i32, i32* %6
%70 = add nsw i32 %69, 1
%71 = sext i32 %70 to i64
%72 = getelementptr inbounds i8*, i8** %68, i64 %71
%73 = load i8*, i8** %72
%74 = icmp eq i8* %73, null
br i1 %74, label %75, label %78
75: ; preds = %67
%76 = call i32 @perror(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i64 0, i64 0))
%77 = call i32 @_exit(i32 -1)
unreachable
78: ; preds = %67
%79 = load i8**, i8*** %4
%80 = load i32, i32* %6
%81 = add nsw i32 %80, 1
%82 = sext i32 %81 to i64
%83 = getelementptr inbounds i8*, i8** %79, i64 %82
%84 = load i8*, i8** %83
%85 = load i32, i32* @O_RDWR
%86 = load i32, i32* @O_CREAT
%87 = or i32 %85, %86
%88 = load i32, i32* @O_TRUNC
%89 = or i32 %87, %88
%90 = load i32, i32* @S_IRUSR
%91 = load i32, i32* @S_IWUSR
%92 = or i32 %90, %91
%93 = call i32 @open(i8* %84, i32 %89, i32 %92)
store i32 %93, i32* %5
%94 = load i32, i32* %5
%95 = icmp slt i32 %94, 0
br i1 %95, label %96, label %99
96: ; preds = %78
%97 = call i32 @perror(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.6, i64 0, i64 0))
%98 = call i32 @_exit(i32 -1)
unreachable
99: ; preds = %78
%100 = load i32, i32* %5
%101 = call i32 @dup2(i32 %100, i32 1)
%102 = load i32, i32* %5
%103 = call i32 @close(i32 %102)
%104 = load i8**, i8*** %4
%105 = load i32, i32* %6
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds i8*, i8** %104, i64 %106
store i8* null, i8** %107
br label %108
108: ; preds = %99, %64
%109 = load i32, i32* %7
%110 = icmp ne i32 %109, 0
br i1 %110, label %111, label %152
111: ; preds = %108
%112 = load i8**, i8*** %4
%113 = load i32, i32* %7
%114 = add nsw i32 %113, 1
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds i8*, i8** %112, i64 %115
%117 = load i8*, i8** %116
%118 = icmp eq i8* %117, null
br i1 %118, label %119, label %122
119: ; preds = %111
%120 = call i32 @perror(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.7, i64 0, i64 0))
%121 = call i32 @_exit(i32 -1)
unreachable
122: ; preds = %111
%123 = load i8**, i8*** %4
%124 = load i32, i32* %6
%125 = add nsw i32 %124, 1
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds i8*, i8** %123, i64 %126
%128 = load i8*, i8** %127
%129 = load i32, i32* @O_RDWR
%130 = load i32, i32* @O_CREAT
%131 = or i32 %129, %130
%132 = load i32, i32* @O_TRUNC
%133 = or i32 %131, %132
%134 = load i32, i32* @S_IRUSR
%135 = load i32, i32* @S_IWUSR
%136 = or i32 %134, %135
%137 = call i32 @open(i8* %128, i32 %133, i32 %136)
store i32 %137, i32* %5
%138 = load i32, i32* %5
%139 = icmp slt i32 %138, 0
br i1 %139, label %140, label %143
140: ; preds = %122
%141 = call i32 @perror(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i64 0, i64 0))
%142 = call i32 @_exit(i32 -1)
unreachable
143: ; preds = %122
%144 = load i32, i32* %5
%145 = call i32 @dup2(i32 %144, i32 0)
%146 = load i32, i32* %5
%147 = call i32 @close(i32 %146)
%148 = load i8**, i8*** %4
%149 = load i32, i32* %7
%150 = sext i32 %149 to i64
%151 = getelementptr inbounds i8*, i8** %148, i64 %150
store i8* null, i8** %151
br label %152
152: ; preds = %143, %108
ret void
}

LLVM IR (-O2):
@.str = [2 x i8] c">\00"
@.str.1 = [45 x i8] c"ERROR: Cannot output to more than one file.\0A\00"
@.str.2 = [28 x i8] c"ERROR: No Command Entered.\0A\00"
@.str.3 = [2 x i8] c"<\00"
@.str.4 = [46 x i8] c"ERROR: Cannot input from more than one file.\0A\00"
@.str.5 = [17 x i8] c"ERROR: No file.\0A\00"
@O_RDWR = global i32 0
@O_CREAT = global i32 0
@O_TRUNC = global i32 0
@S_IRUSR = global i32 0
@S_IWUSR = global i32 0
@.str.6 = [19 x i8] c"ERROR: No file. 1\0A\00"
@.str.7 = [19 x i8] c"ERROR: No file. 2\0A\00"
define void @handle_redir(i32 %0, i8** nocapture %1) {
%3 = icmp sgt i32 %0, 0
br i1 %3, label %4, label %117
4: ; preds = %2
%5 = zext i32 %0 to i64
%6 = load i8*, i8** %1
%7 = tail call i64 @strcmp(i8* %6, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%8 = icmp eq i64 %7, 0
br i1 %8, label %30, label %9
9: ; preds = %4
%10 = load i8*, i8** %1
%11 = tail call i64 @strcmp(i8* %10, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i64 0, i64 0))
%12 = icmp eq i64 %11, 0
br i1 %12, label %44, label %13
13: ; preds = %9
%14 = icmp eq i32 %0, 1
br i1 %14, label %117, label %15
15: ; preds = %13, %47
%16 = phi i64 [ %50, %47 ], [ 1, %13 ]
%17 = phi i32 [ %49, %47 ], [ 0, %13 ]
%18 = phi i32 [ %48, %47 ], [ 0, %13 ]
%19 = getelementptr inbounds i8*, i8** %1, i64 %16
%20 = load i8*, i8** %19
%21 = tail call i64 @strcmp(i8* %20, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i64 0, i64 0))
%22 = icmp eq i64 %21, 0
br i1 %22, label %23, label %33
23: ; preds = %15
%24 = icmp eq i32 %18, 0
br i1 %24, label %28, label %25
25: ; preds = %23
%26 = tail call i32 @perror(i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.1, i64 0, i64 0))
%27 = tail call i32 @_exit(i32 -1)
unreachable
28: ; preds = %23
%29 = trunc i64 %16 to i32
br label %47
30: ; preds = %4
%31 = tail call i32 @perror(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.2, i64 0, i64 0))
%32 = tail call i32 @_exit(i32 -1)
unreachable
33: ; preds = %15
%34 = load i8*, i8** %19
%35 = tail call i64 @strcmp(i8* %34, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.3, i64 0, i64 0))
%36 = icmp eq i64 %35, 0
br i1 %36, label %37, label %47
37: ; preds = %33
%38 = icmp eq i32 %17, 0
br i1 %38, label %42, label %39
39: ; preds = %37
%40 = tail call i32 @perror(i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.4, i64 0, i64 0))
%41 = tail call i32 @_exit(i32 -1)
unreachable
42: ; preds = %37
%43 = trunc i64 %16 to i32
br label %47
44: ; preds = %9
%45 = tail call i32 @perror(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.2, i64 0, i64 0))
%46 = tail call i32 @_exit(i32 -1)
unreachable
47: ; preds = %42, %28, %33
%48 = phi i32 [ %18, %33 ], [ %29, %28 ], [ %18, %42 ]
%49 = phi i32 [ %17, %33 ], [ %17, %28 ], [ %43, %42 ]
%50 = add nuw nsw i64 %16, 1
%51 = icmp eq i64 %50, %5
br i1 %51, label %52, label %15
52: ; preds = %47
%53 = icmp eq i32 %48, 0
br i1 %53, label %82, label %54
54: ; preds = %52
%55 = add nsw i32 %48, 1
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i8*, i8** %1, i64 %56
%58 = load i8*, i8** %57
%59 = icmp eq i8* %58, null
br i1 %59, label %60, label %63
60: ; preds = %54
%61 = tail call i32 @perror(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i64 0, i64 0))
%62 = tail call i32 @_exit(i32 -1)
unreachable
63: ; preds = %54
%64 = load i32, i32* @O_RDWR
%65 = load i32, i32* @O_CREAT
%66 = or i32 %65, %64
%67 = load i32, i32* @O_TRUNC
%68 = or i32 %66, %67
%69 = load i32, i32* @S_IRUSR
%70 = load i32, i32* @S_IWUSR
%71 = or i32 %70, %69
%72 = tail call i32 @open(i8* %58, i32 %68, i32 %71)
%73 = icmp slt i32 %72, 0
br i1 %73, label %74, label %77
74: ; preds = %63
%75 = tail call i32 @perror(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.6, i64 0, i64 0))
%76 = tail call i32 @_exit(i32 -1)
unreachable
77: ; preds = %63
%78 = tail call i32 @dup2(i32 %72, i32 1)
%79 = tail call i32 @close(i32 %72)
%80 = sext i32 %48 to i64
%81 = getelementptr inbounds i8*, i8** %1, i64 %80
store i8* null, i8** %81
br label %82
82: ; preds = %77, %52
%83 = phi i32 [ %48, %77 ], [ 0, %52 ]
%84 = icmp eq i32 %49, 0
br i1 %84, label %117, label %85
85: ; preds = %82
%86 = add nsw i32 %49, 1
%87 = sext i32 %86 to i64
%88 = getelementptr inbounds i8*, i8** %1, i64 %87
%89 = load i8*, i8** %88
%90 = icmp eq i8* %89, null
br i1 %90, label %91, label %94
91: ; preds = %85
%92 = tail call i32 @perror(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.7, i64 0, i64 0))
%93 = tail call i32 @_exit(i32 -1)
unreachable
94: ; preds = %85
%95 = add nsw i32 %83, 1
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds i8*, i8** %1, i64 %96
%98 = load i8*, i8** %97
%99 = load i32, i32* @O_RDWR
%100 = load i32, i32* @O_CREAT
%101 = or i32 %100, %99
%102 = load i32, i32* @O_TRUNC
%103 = or i32 %101, %102
%104 = load i32, i32* @S_IRUSR
%105 = load i32, i32* @S_IWUSR
%106 = or i32 %105, %104
%107 = tail call i32 @open(i8* %98, i32 %103, i32 %106)
%108 = icmp slt i32 %107, 0
br i1 %108, label %109, label %112
109: ; preds = %94
%110 = tail call i32 @perror(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i64 0, i64 0))
%111 = tail call i32 @_exit(i32 -1)
unreachable
112: ; preds = %94
%113 = tail call i32 @dup2(i32 %107, i32 0)
%114 = tail call i32 @close(i32 %107)
%115 = sext i32 %49 to i64
%116 = getelementptr inbounds i8*, i8** %1, i64 %115
store i8* null, i8** %116
br label %117
117: ; preds = %2, %13, %112, %82
ret void
}