#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*/ free(char *);
char *getcwd(int /*<<< orphan*/ *, size_t);
char *getenv(char *);
char *malloc(int);
int /*<<< orphan*/ memmove(char *, char *, int);
int /*<<< orphan*/ strcpy(char *, char *);
int strlen(char const *);
int /*<<< orphan*/ strncat(char *, char const *, size_t);
char *strrchr(char *, char);
char *_fullpath(char *target, const char *path, size_t size) {
  char *out;
  char *p;
  int target_alloced = 0;
  if (target == NULL) {
    if ((target = malloc(260 + 1)) == NULL) {
      return (NULL);
    }
    target_alloced = 1;
  }
  out = target;
  *out = 0;
  if (*path != '/') {
    if (*path == '~') {
      p = getenv("HOME");
      if (p == NULL || strlen(p) + strlen(path) >= size) {
        if (target_alloced)
          free(target);
        return (NULL);
      }
      strcpy(target, p);
      out = strrchr(target, '\0');
      path++;
    } else {
      p = getcwd(NULL, size);
      if (p == NULL || strlen(p) + strlen(path) >= size) {
        if (target_alloced)
          free(target);
        return (NULL);
      }
      strcpy(target, p);
      free(p);
      out = strrchr(target, '\0');
      *(out++) = '/';
      *out = 0;
      out--;
    }
  }
  strncat(target, path, size - 1);
  for (; *out; out++) {
    while (*out == '/') {
      if (*(out + 1) == '/')
        memmove(out, out + 1, strlen(out));
      else if (*(out + 1) == '.' && (*(out + 2) == '/' || *(out + 2) == 0))
        memmove(out, out + 2, strlen(out) - 1);
      else if (*(out + 1) == '.' && *(out + 2) == '.' &&
               (*(out + 3) == '/' || *(out + 3) == 0)) {
        *out = 0;
        p = strrchr(target, '/');
        if (p == NULL)
          p = target;
        memmove(p, out + 3, strlen(out + 3) + 1);
        out = p;
      } else {
        out++;
      }
    }
  }
  return (target);
}


x86 assembly (clang, -O0):
<_fullpath>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movl   $0x0,-0x34(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    11e2 <_fullpath+0x52>
mov    $0x105,%edi
call   10a0 <malloc@plt>
mov    %rax,-0x10(%rbp)
cmp    $0x0,%rax
jne    11db <_fullpath+0x4b>
movq   $0x0,-0x8(%rbp)
jmp    151d <_fullpath+0x38d>
movl   $0x1,-0x34(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
je     1354 <_fullpath+0x1c4>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7e,%eax
jne    12a1 <_fullpath+0x111>
lea    0xde8(%rip),%rdi
call   1030 <getenv@plt>
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
je     1254 <_fullpath+0xc4>
mov    -0x30(%rbp),%rdi
call   1060 <strlen@plt>
mov    %eax,-0x38(%rbp)
mov    -0x18(%rbp),%rdi
call   1060 <strlen@plt>
mov    %eax,%ecx
mov    -0x38(%rbp),%eax
add    %ecx,%eax
cltq
cmp    -0x20(%rbp),%rax
jb     1274 <_fullpath+0xe4>
cmpl   $0x0,-0x34(%rbp)
je     1267 <_fullpath+0xd7>
mov    -0x10(%rbp),%rdi
call   1040 <free@plt>
movq   $0x0,-0x8(%rbp)
jmp    151d <_fullpath+0x38d>
mov    -0x10(%rbp),%rdi
mov    -0x30(%rbp),%rsi
call   1050 <strcpy@plt>
mov    -0x10(%rbp),%rdi
xor    %esi,%esi
call   1070 <strrchr@plt>
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    134f <_fullpath+0x1bf>
mov    -0x20(%rbp),%rsi
xor    %eax,%eax
mov    %eax,%edi
call   1080 <getcwd@plt>
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
je     12e5 <_fullpath+0x155>
mov    -0x30(%rbp),%rdi
call   1060 <strlen@plt>
mov    %eax,-0x3c(%rbp)
mov    -0x18(%rbp),%rdi
call   1060 <strlen@plt>
mov    %eax,%ecx
mov    -0x3c(%rbp),%eax
add    %ecx,%eax
cltq
cmp    -0x20(%rbp),%rax
jb     1305 <_fullpath+0x175>
cmpl   $0x0,-0x34(%rbp)
je     12f8 <_fullpath+0x168>
mov    -0x10(%rbp),%rdi
call   1040 <free@plt>
movq   $0x0,-0x8(%rbp)
jmp    151d <_fullpath+0x38d>
mov    -0x10(%rbp),%rdi
mov    -0x30(%rbp),%rsi
call   1050 <strcpy@plt>
mov    -0x30(%rbp),%rdi
call   1040 <free@plt>
mov    -0x10(%rbp),%rdi
xor    %esi,%esi
call   1070 <strrchr@plt>
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x2f,(%rax)
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
jmp    1354 <_fullpath+0x1c4>
mov    -0x10(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x20(%rbp),%rdx
sub    $0x1,%rdx
call   1090 <strncat@plt>
mov    -0x28(%rbp),%rax
cmpb   $0x0,(%rax)
je     1515 <_fullpath+0x385>
jmp    137b <_fullpath+0x1eb>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    14ff <_fullpath+0x36f>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
jne    13cd <_fullpath+0x23d>
mov    -0x28(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x48(%rbp)
mov    -0x28(%rbp),%rdi
call   1060 <strlen@plt>
mov    -0x50(%rbp),%rdi
mov    -0x48(%rbp),%rsi
mov    %eax,%edx
call   10b0 <memmove@plt>
jmp    14fa <_fullpath+0x36a>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    1434 <_fullpath+0x2a4>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2f,%eax
je     1400 <_fullpath+0x270>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x0,%eax
jne    1434 <_fullpath+0x2a4>
mov    -0x28(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x28(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x58(%rbp)
mov    -0x28(%rbp),%rdi
call   1060 <strlen@plt>
mov    -0x60(%rbp),%rdi
mov    -0x58(%rbp),%rsi
mov    %eax,%edx
sub    $0x1,%edx
call   10b0 <memmove@plt>
jmp    14f5 <_fullpath+0x365>
mov    -0x28(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    14e4 <_fullpath+0x354>
mov    -0x28(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2e,%eax
jne    14e4 <_fullpath+0x354>
mov    -0x28(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0x2f,%eax
je     1478 <_fullpath+0x2e8>
mov    -0x28(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0x0,%eax
jne    14e4 <_fullpath+0x354>
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x10(%rbp),%rdi
mov    $0x2f,%esi
call   1070 <strrchr@plt>
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jne    14a4 <_fullpath+0x314>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x28(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x68(%rbp)
mov    -0x28(%rbp),%rdi
add    $0x3,%rdi
call   1060 <strlen@plt>
mov    -0x70(%rbp),%rdi
mov    -0x68(%rbp),%rsi
mov    %eax,%edx
add    $0x1,%edx
call   10b0 <memmove@plt>
mov    -0x30(%rbp),%rax
mov    %rax,-0x28(%rbp)
jmp    14f0 <_fullpath+0x360>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    14f5 <_fullpath+0x365>
jmp    14fa <_fullpath+0x36a>
jmp    137b <_fullpath+0x1eb>
jmp    1504 <_fullpath+0x374>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1369 <_fullpath+0x1d9>
mov    -0x10(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_fullpath>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %rdx,%r14
mov    %rsi,%r15
mov    %rdi,%rbx
mov    %rdi,%r12
test   %rdi,%rdi
jne    11c2 <_fullpath+0x32>
mov    $0x105,%edi
call   10a0 <malloc@plt>
mov    %rax,%r12
test   %rax,%rax
je     1374 <_fullpath+0x1e4>
movb   $0x0,(%r12)
mov    (%r15),%al
cmp    $0x2f,%al
je     1228 <_fullpath+0x98>
cmp    $0x7e,%al
jne    122d <_fullpath+0x9d>
lea    0xe27(%rip),%rdi
call   1030 <getenv@plt>
test   %rax,%rax
je     1367 <_fullpath+0x1d7>
mov    %rax,%r13
mov    %rax,%rdi
call   1060 <strlen@plt>
mov    %eax,%ebp
mov    %r15,%rdi
call   1060 <strlen@plt>
add    %ebp,%eax
cltq
cmp    %r14,%rax
jae    1367 <_fullpath+0x1d7>
mov    %r12,%rdi
mov    %r13,%rsi
call   1050 <strcpy@plt>
mov    %r12,%rdi
call   1060 <strlen@plt>
mov    %rax,%rbx
add    %r12,%rbx
add    $0x1,%r15
jmp    1288 <_fullpath+0xf8>
mov    %r12,%rbx
jmp    1288 <_fullpath+0xf8>
xor    %edi,%edi
mov    %r14,%rsi
call   1080 <getcwd@plt>
test   %rax,%rax
je     1367 <_fullpath+0x1d7>
mov    %rax,%r13
mov    %rax,%rdi
call   1060 <strlen@plt>
mov    %eax,%ebp
mov    %r15,%rdi
call   1060 <strlen@plt>
add    %ebp,%eax
cltq
cmp    %r14,%rax
jae    1367 <_fullpath+0x1d7>
mov    %r12,%rdi
mov    %r13,%rsi
call   1050 <strcpy@plt>
mov    %r13,%rdi
call   1040 <free@plt>
mov    %r12,%rdi
call   1060 <strlen@plt>
lea    (%r12,%rax,1),%rbx
movw   $0x2f,(%r12,%rax,1)
add    $0xffffffffffffffff,%r14
mov    %r12,%rdi
mov    %r15,%rsi
mov    %r14,%rdx
call   1090 <strncat@plt>
mov    (%rbx),%al
jmp    12ab <_fullpath+0x11b>
xchg   %ax,%ax
mov    0x1(%r14),%al
add    $0x1,%r14
mov    %r14,%rbx
test   %al,%al
je     1377 <_fullpath+0x1e7>
cmp    $0x2f,%al
je     12e6 <_fullpath+0x156>
mov    %rbx,%r14
jmp    12a0 <_fullpath+0x110>
nopl   0x0(%rax)
lea    0x2(%rbx),%rbp
mov    %rbx,%rdi
call   1060 <strlen@plt>
lea    -0x1(%rax),%edx
mov    %rbx,%rdi
mov    %rbp,%rsi
call   10b0 <memmove@plt>
mov    %rbx,%r14
cmpb   $0x2f,(%r14)
mov    %r14,%rbx
jne    12a0 <_fullpath+0x110>
lea    0x1(%rbx),%r14
movzbl 0x1(%rbx),%eax
cmp    $0x2e,%al
je     1310 <_fullpath+0x180>
cmp    $0x2f,%al
jne    12a0 <_fullpath+0x110>
mov    %rbx,%rdi
call   1060 <strlen@plt>
mov    %rbx,%rdi
mov    %r14,%rsi
mov    %eax,%edx
jmp    12d5 <_fullpath+0x145>
nopl   0x0(%rax,%rax,1)
movzbl 0x2(%rbx),%eax
cmp    $0x2f,%al
je     12c0 <_fullpath+0x130>
cmp    $0x2e,%al
je     1322 <_fullpath+0x192>
test   %al,%al
je     12c0 <_fullpath+0x130>
jmp    12dd <_fullpath+0x14d>
movzbl 0x3(%rbx),%eax
cmp    $0x2f,%al
je     132e <_fullpath+0x19e>
test   %al,%al
jne    12dd <_fullpath+0x14d>
movb   $0x0,(%rbx)
add    $0x3,%rbx
mov    %r12,%rdi
mov    $0x2f,%esi
call   1070 <strrchr@plt>
mov    %rax,%r14
test   %rax,%rax
cmove  %r12,%r14
mov    %rbx,%rdi
call   1060 <strlen@plt>
lea    0x1(%rax),%edx
mov    %r14,%rdi
mov    %rbx,%rsi
call   10b0 <memmove@plt>
jmp    12dd <_fullpath+0x14d>
test   %rbx,%rbx
jne    1374 <_fullpath+0x1e4>
mov    %r12,%rdi
call   1040 <free@plt>
xor    %r12d,%r12d
mov    %r12,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [5 x i8] c"HOME\00"
define i8* @_fullpath(i8* %0, i8* %1, i64 %2) {
%4 = icmp eq i8* %0, null
br i1 %4, label %5, label %8
5: ; preds = %3
%6 = tail call dereferenceable_or_null(261) i8* @malloc(i32 261)
%7 = icmp eq i8* %6, null
br i1 %7, label %89, label %8
8: ; preds = %5, %3
%9 = phi i8* [ %0, %3 ], [ %6, %5 ]
store i8 0, i8* %9
%10 = load i8, i8* %1
switch i8 %10, label %26 [
i8 47, label %43
i8 126, label %11
]
11: ; preds = %8
%12 = tail call i8* @getenv(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
%13 = icmp eq i8* %12, null
br i1 %13, label %20, label %14
14: ; preds = %11
%15 = tail call i32 @strlen(i8* %12)
%16 = tail call i32 @strlen(i8* %1)
%17 = add nsw i32 %16, %15
%18 = sext i32 %17 to i64
%19 = icmp ult i64 %18, %2
br i1 %19, label %21, label %20
20: ; preds = %14, %11
br i1 %4, label %87, label %89
21: ; preds = %14
%22 = tail call i32 @strcpy(i8* %9, i8* %12)
%23 = tail call i64 bitcast (i32 (i8*)* @strlen to i64 (i8*)*)(i8* %9)
%24 = getelementptr i8, i8* %9, i64 %23
%25 = getelementptr inbounds i8, i8* %1, i64 1
br label %43
26: ; preds = %8
%27 = tail call i8* @getcwd(i32* null, i64 %2)
%28 = icmp eq i8* %27, null
br i1 %28, label %35, label %29
29: ; preds = %26
%30 = tail call i32 @strlen(i8* %27)
%31 = tail call i32 @strlen(i8* %1)
%32 = add nsw i32 %31, %30
%33 = sext i32 %32 to i64
%34 = icmp ult i64 %33, %2
br i1 %34, label %36, label %35
35: ; preds = %29, %26
br i1 %4, label %87, label %89
36: ; preds = %29
%37 = tail call i32 @strcpy(i8* %9, i8* %27)
%38 = tail call i32 @free(i8* %27)
%39 = tail call i64 bitcast (i32 (i8*)* @strlen to i64 (i8*)*)(i8* %9)
%40 = getelementptr i8, i8* %9, i64 %39
%41 = getelementptr inbounds i8, i8* %40, i64 1
store i8 47, i8* %40
store i8 0, i8* %41
%42 = getelementptr inbounds i8, i8* %41, i64 -1
br label %43
43: ; preds = %8, %21, %36
%44 = phi i8* [ %25, %21 ], [ %1, %36 ], [ %1, %8 ]
%45 = phi i8* [ %24, %21 ], [ %42, %36 ], [ %9, %8 ]
%46 = add i64 %2, -1
%47 = tail call i32 @strncat(i8* %9, i8* %44, i64 %46)
%48 = load i8, i8* %45
%49 = icmp eq i8 %48, 0
br i1 %49, label %89, label %50
50: ; preds = %43, %82
%51 = phi i8 [ %85, %82 ], [ %48, %43 ]
%52 = phi i8* [ %84, %82 ], [ %45, %43 ]
%53 = icmp eq i8 %51, 47
br i1 %53, label %54, label %82
54: ; preds = %50, %78
%55 = phi i8* [ %79, %78 ], [ %52, %50 ]
%56 = getelementptr inbounds i8, i8* %55, i64 1
%57 = load i8, i8* %56
switch i8 %57, label %82 [
i8 47, label %58
i8 46, label %61
]
58: ; preds = %54
%59 = tail call i32 @strlen(i8* %55)
%60 = tail call i32 @memmove(i8* %55, i8* %56, i32 %59)
br label %78
61: ; preds = %54
%62 = getelementptr inbounds i8, i8* %55, i64 2
%63 = load i8, i8* %62
switch i8 %63, label %78 [
i8 47, label %64
i8 0, label %64
i8 46, label %68
]
64: ; preds = %61, %61
%65 = tail call i32 @strlen(i8* %55)
%66 = add nsw i32 %65, -1
%67 = tail call i32 @memmove(i8* %55, i8* %62, i32 %66)
br label %78
68: ; preds = %61
%69 = getelementptr inbounds i8, i8* %55, i64 3
%70 = load i8, i8* %69
switch i8 %70, label %78 [
i8 47, label %71
i8 0, label %71
]
71: ; preds = %68, %68
store i8 0, i8* %55
%72 = tail call i8* @strrchr(i8* %9, i8 signext 47)
%73 = icmp eq i8* %72, null
%74 = select i1 %73, i8* %9, i8* %72
%75 = tail call i32 @strlen(i8* %69)
%76 = add nsw i32 %75, 1
%77 = tail call i32 @memmove(i8* %74, i8* %69, i32 %76)
br label %78
78: ; preds = %61, %68, %64, %71, %58
%79 = phi i8* [ %56, %68 ], [ %74, %71 ], [ %55, %64 ], [ %55, %58 ], [ %56, %61 ]
%80 = load i8, i8* %79
%81 = icmp eq i8 %80, 47
br i1 %81, label %54, label %82
82: ; preds = %54, %78, %50
%83 = phi i8* [ %52, %50 ], [ %56, %54 ], [ %79, %78 ]
%84 = getelementptr inbounds i8, i8* %83, i64 1
%85 = load i8, i8* %84
%86 = icmp eq i8 %85, 0
br i1 %86, label %89, label %50
87: ; preds = %35, %20
%88 = tail call i32 @free(i8* %9)
br label %89
89: ; preds = %82, %87, %43, %35, %20, %5
%90 = phi i8* [ null, %5 ], [ null, %20 ], [ null, %35 ], [ %9, %43 ], [ null, %87 ], [ %9, %82 ]
ret i8* %90
}