#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 /*<<< orphan*/ strcpy(char *, char const *);
int strlen(char *);
void ___chdir(char *dest, const char *src) {
  if (src[0] == '/') {
    strcpy(dest, src);
    return;
  }
  char *ptr = dest + strlen(dest);
  while (*src) {
    if (src[0] == '.' && src[1] == 0)
      break;
    if (src[0] == '.' && src[1] == '/') {
      ++src;
      ++src;
      continue;
    }
    if (src[0] == '.' && src[1] == '.' && (src[2] == 0 || src[2] == '/')) {
      while (ptr > dest && ptr[-1] != '/')
        --ptr;
      ++src;
      ++src;
      if (*src == 0)
        break;
      ++src;
      continue;
    }
    *ptr++ = '/';
    if (*src == '/')
      ++src;
    while (*src && *src != '/')
      *ptr++ = *src++;
  }
  *ptr = 0;
}


x86 assembly (clang, -O0):
<___chdir>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    1152 <___chdir+0x32>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
call   1030 <strcpy@plt>
jmp    134a <___chdir+0x22a>
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <strlen@plt>
mov    %eax,%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     1343 <___chdir+0x223>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    11a6 <___chdir+0x86>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
jne    11a6 <___chdir+0x86>
jmp    1343 <___chdir+0x223>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    11e4 <___chdir+0xc4>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
jne    11e4 <___chdir+0xc4>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1173 <___chdir+0x53>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    12af <___chdir+0x18f>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    12af <___chdir+0x18f>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
je     1227 <___chdir+0x107>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2f,%eax
jne    12af <___chdir+0x18f>
jmp    122c <___chdir+0x10c>
mov    -0x18(%rbp),%rcx
xor    %eax,%eax
cmp    -0x8(%rbp),%rcx
mov    %al,-0x21(%rbp)
jbe    1250 <___chdir+0x130>
mov    -0x18(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x21(%rbp)
mov    -0x21(%rbp),%al
test   $0x1,%al
jne    1260 <___chdir+0x140>
jmp    1271 <___chdir+0x151>
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    122c <___chdir+0x10c>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    129e <___chdir+0x17e>
jmp    1343 <___chdir+0x223>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1173 <___chdir+0x53>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x2f,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    12dd <___chdir+0x1bd>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    12e2 <___chdir+0x1c2>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x22(%rbp)
je     1307 <___chdir+0x1e7>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x22(%rbp)
mov    -0x22(%rbp),%al
test   $0x1,%al
jne    1317 <___chdir+0x1f7>
jmp    133e <___chdir+0x21e>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x18(%rbp)
mov    %cl,(%rax)
jmp    12e2 <___chdir+0x1c2>
jmp    1173 <___chdir+0x53>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<___chdir>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%rbx
mov    %rdi,%r14
cmpb   $0x2f,(%rsi)
jne    1141 <___chdir+0x21>
mov    %r14,%rdi
mov    %rbx,%rsi
add    $0x8,%rsp
pop    %rbx
pop    %r14
jmp    1030 <strcpy@plt>
mov    %r14,%rdi
call   1040 <strlen@plt>
cltq
add    %r14,%rax
jmp    1154 <___chdir+0x34>
add    $0x2,%rbx
mov    (%rbx),%cl
cmp    $0x2e,%cl
jne    119f <___chdir+0x7f>
mov    0x1(%rbx),%cl
cmp    $0x2f,%cl
je     1150 <___chdir+0x30>
test   %cl,%cl
je     11db <___chdir+0xbb>
cmp    $0x2e,%cl
jne    11a3 <___chdir+0x83>
mov    0x2(%rbx),%cl
cmp    $0x2f,%cl
je     1180 <___chdir+0x60>
test   %cl,%cl
jne    11a3 <___chdir+0x83>
nopl   0x0(%rax,%rax,1)
mov    %rax,%rdx
cmp    %r14,%rax
jbe    1192 <___chdir+0x72>
lea    -0x1(%rdx),%rax
cmpb   $0x2f,-0x1(%rdx)
jne    1180 <___chdir+0x60>
test   %cl,%cl
je     11d8 <___chdir+0xb8>
add    $0x3,%rbx
mov    %rdx,%rax
jmp    1154 <___chdir+0x34>
test   %cl,%cl
je     11db <___chdir+0xbb>
movb   $0x2f,(%rax)
xor    %ecx,%ecx
cmpb   $0x2f,(%rbx)
sete   %cl
add    %rcx,%rbx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
add    $0x1,%rax
movzbl (%rbx),%ecx
test   %cl,%cl
je     1154 <___chdir+0x34>
cmp    $0x2f,%cl
je     1154 <___chdir+0x34>
add    $0x1,%rbx
mov    %cl,(%rax)
jmp    11c0 <___chdir+0xa0>
mov    %rdx,%rax
movb   $0x0,(%rax)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define void @___chdir(i8* %0, i8* %1) {
%3 = load i8, i8* %1
%4 = icmp eq i8 %3, 47
br i1 %4, label %5, label %7
5: ; preds = %2
%6 = tail call i32 @strcpy(i8* %0, i8* %1)
br label %54
7: ; preds = %2
%8 = tail call i32 @strlen(i8* %0)
%9 = sext i32 %8 to i64
%10 = getelementptr inbounds i8, i8* %0, i64 %9
br label %11
11: ; preds = %37, %7
%12 = phi i8* [ %1, %7 ], [ %38, %37 ]
%13 = phi i8* [ %10, %7 ], [ %39, %37 ]
br label %14
14: ; preds = %11, %20
%15 = phi i8* [ %21, %20 ], [ %12, %11 ]
%16 = load i8, i8* %15
switch i8 %16, label %40 [
i8 0, label %52
i8 46, label %17
]
17: ; preds = %14
%18 = getelementptr inbounds i8, i8* %15, i64 1
%19 = load i8, i8* %18
switch i8 %19, label %40 [
i8 0, label %52
i8 47, label %20
i8 46, label %22
]
20: ; preds = %17
%21 = getelementptr inbounds i8, i8* %15, i64 2
br label %14
22: ; preds = %17
%23 = getelementptr inbounds i8, i8* %15, i64 2
%24 = load i8, i8* %23
switch i8 %24, label %40 [
i8 0, label %25
i8 47, label %25
]
25: ; preds = %22, %22
br label %26
26: ; preds = %25, %29
%27 = phi i8* [ %30, %29 ], [ %13, %25 ]
%28 = icmp ugt i8* %27, %0
br i1 %28, label %29, label %33
29: ; preds = %26
%30 = getelementptr inbounds i8, i8* %27, i64 -1
%31 = load i8, i8* %30
%32 = icmp eq i8 %31, 47
br i1 %32, label %33, label %26
33: ; preds = %26, %29
%34 = icmp eq i8 %24, 0
br i1 %34, label %52, label %35
35: ; preds = %33
%36 = getelementptr inbounds i8, i8* %15, i64 3
br label %37
37: ; preds = %45, %45, %35
%38 = phi i8* [ %36, %35 ], [ %46, %45 ], [ %46, %45 ]
%39 = phi i8* [ %27, %35 ], [ %48, %45 ], [ %48, %45 ]
br label %11
40: ; preds = %14, %17, %22
store i8 47, i8* %13
%41 = load i8, i8* %15
%42 = icmp eq i8 %41, 47
%43 = zext i1 %42 to i64
%44 = getelementptr i8, i8* %15, i64 %43
br label %45
45: ; preds = %50, %40
%46 = phi i8* [ %44, %40 ], [ %51, %50 ]
%47 = phi i8* [ %13, %40 ], [ %48, %50 ]
%48 = getelementptr inbounds i8, i8* %47, i64 1
%49 = load i8, i8* %46
switch i8 %49, label %50 [
i8 0, label %37
i8 47, label %37
]
50: ; preds = %45
%51 = getelementptr inbounds i8, i8* %46, i64 1
store i8 %49, i8* %48
br label %45
52: ; preds = %33, %14, %17
%53 = phi i8* [ %13, %17 ], [ %13, %14 ], [ %27, %33 ]
store i8 0, i8* %53
br label %54
54: ; preds = %52, %5
ret void
}