#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 */
char *getenv(char *);
scalar_t__ malloc(scalar_t__);
int /*<<< orphan*/ sprintf(char *, char *, char *, char *);
int /*<<< orphan*/ strcpy(char *, char *);
scalar_t__ strlen(char *);
char *get_full_path(char *ipath) {
  char *i, *j, *k;
  char *opath, *tmp;
  if (*ipath == '~' && *(ipath + 1) == '/') {
    tmp = getenv("HOME");
    opath = (char *)malloc(strlen(tmp) + strlen(ipath) + 1);
    sprintf(opath, "%s%s", tmp, ipath + 1);
  } else if (*ipath != '/') {
    tmp = getenv("PWD");
    opath = (char *)malloc(strlen(tmp) + strlen(ipath) + 2);
    sprintf(opath, "%s/%s", tmp, ipath);
  } else {
    opath = (char *)malloc(strlen(ipath) + 1);
    strcpy(opath, ipath);
  }
  i = opath;
  do {
    if (i > ipath && *(i + 1) == '.' && *(i - 1) == '/' && *i == '.' &&
        *(i + 2) == '/') {
      j = i - 2;
      while (*j != '/' && j > opath) {
        j--;
      };
      if (j < opath) {
        j = opath;
      } else if (j == opath) {
        *j = '/';
      }
      i += 2;
    } else if (i > ipath && *i == '.' && *(i - 1) == '/' && *(i + 1) == '/') {
      j = i - 1;
      i += 1;
    } else if (i > ipath && *i == '/' && *(i - 1) == '/') {
      j = i - 1;
    } else if (*i == '/' && *(i + 1) == '/') {
      j = i;
      while (*(i + 1) == '/') {
        i += 1;
      }
    } else if (*i == '/' && *(i + 1) == '\0') {
      *i = '\0';
    } else {
      j = i;
    }
    if (i != j) {
      k = j;
      do {
        *j = *i;
        j++;
        i++;
      } while (*i != '\0');
      *j = '\0';
      i = k;
    }
    i++;
  } while (*i != '\0' && i >= opath);
  return opath;
}


x86 assembly (clang, -O0):
<get_full_path>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x7e,%eax
jne    11d8 <get_full_path+0x88>
mov    -0x8(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
jne    11d8 <get_full_path+0x88>
lea    0xe7c(%rip),%rdi
call   1030 <getenv@plt>
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rdi
call   1050 <strlen@plt>
mov    -0x38(%rbp),%rdi
add    %rax,%rdi
add    $0x1,%rdi
call   1060 <malloc@plt>
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rdx
mov    -0x8(%rbp),%rcx
add    $0x1,%rcx
lea    0xe37(%rip),%rsi
call   1070 <sprintf@plt>
jmp    126a <get_full_path+0x11a>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
je     123f <get_full_path+0xef>
lea    0xe1b(%rip),%rdi
call   1030 <getenv@plt>
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,-0x40(%rbp)
mov    -0x8(%rbp),%rdi
call   1050 <strlen@plt>
mov    -0x40(%rbp),%rdi
add    %rax,%rdi
add    $0x2,%rdi
call   1060 <malloc@plt>
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rdx
mov    -0x8(%rbp),%rcx
lea    0xdd9(%rip),%rsi
call   1070 <sprintf@plt>
jmp    1265 <get_full_path+0x115>
mov    -0x8(%rbp),%rdi
call   1050 <strlen@plt>
mov    %rax,%rdi
add    $0x1,%rdi
call   1060 <malloc@plt>
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rdi
mov    -0x8(%rbp),%rsi
call   1040 <strcpy@plt>
jmp    126a <get_full_path+0x11a>
mov    -0x28(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
jbe    1359 <get_full_path+0x209>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    1359 <get_full_path+0x209>
mov    -0x10(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    1359 <get_full_path+0x209>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1359 <get_full_path+0x209>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2f,%eax
jne    1359 <get_full_path+0x209>
mov    -0x10(%rbp),%rax
add    $0xfffffffffffffffe,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2f,%ecx
mov    %al,-0x41(%rbp)
je     12f2 <get_full_path+0x1a2>
mov    -0x18(%rbp),%rax
cmp    -0x28(%rbp),%rax
seta   %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
test   $0x1,%al
jne    1302 <get_full_path+0x1b2>
jmp    1313 <get_full_path+0x1c3>
mov    -0x18(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    12cf <get_full_path+0x17f>
mov    -0x18(%rbp),%rax
cmp    -0x28(%rbp),%rax
jae    132e <get_full_path+0x1de>
mov    -0x28(%rbp),%rax
mov    %rax,-0x18(%rbp)
jmp    1348 <get_full_path+0x1f8>
mov    -0x18(%rbp),%rax
cmp    -0x28(%rbp),%rax
jne    1343 <get_full_path+0x1f3>
mov    -0x18(%rbp),%rax
movb   $0x2f,(%rax)
jmp    1348 <get_full_path+0x1f8>
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    148f <get_full_path+0x33f>
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
jbe    13b6 <get_full_path+0x266>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    13b6 <get_full_path+0x266>
mov    -0x10(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    13b6 <get_full_path+0x266>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
jne    13b6 <get_full_path+0x266>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    148a <get_full_path+0x33a>
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
jbe    13f6 <get_full_path+0x2a6>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    13f6 <get_full_path+0x2a6>
mov    -0x10(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    13f6 <get_full_path+0x2a6>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x18(%rbp)
jmp    1485 <get_full_path+0x335>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    1446 <get_full_path+0x2f6>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
jne    1446 <get_full_path+0x2f6>
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
jne    1441 <get_full_path+0x2f1>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    141f <get_full_path+0x2cf>
jmp    1480 <get_full_path+0x330>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    1473 <get_full_path+0x323>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x0,%eax
jne    1473 <get_full_path+0x323>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
jmp    147b <get_full_path+0x32b>
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
jmp    1480 <get_full_path+0x330>
jmp    1485 <get_full_path+0x335>
jmp    148a <get_full_path+0x33a>
jmp    148f <get_full_path+0x33f>
mov    -0x10(%rbp),%rax
cmp    -0x18(%rbp),%rax
je     14e8 <get_full_path+0x398>
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    14a5 <get_full_path+0x355>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x20(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x42(%rbp)
je     1517 <get_full_path+0x3c7>
mov    -0x10(%rbp),%rax
cmp    -0x28(%rbp),%rax
setae  %al
mov    %al,-0x42(%rbp)
mov    -0x42(%rbp),%al
test   $0x1,%al
jne    1272 <get_full_path+0x122>
mov    -0x28(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_full_path>:
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdi,%r14
mov    (%rdi),%al
cmp    $0x2f,%al
je     1207 <get_full_path+0xb7>
cmp    $0x7e,%al
jne    11be <get_full_path+0x6e>
cmpb   $0x2f,0x1(%r14)
jne    11be <get_full_path+0x6e>
lea    0x1(%r14),%r15
lea    0xe84(%rip),%rdi
call   1030 <getenv@plt>
mov    %rax,%r12
mov    %rax,%rdi
call   1050 <strlen@plt>
mov    %rax,%rbx
mov    %r14,%rdi
call   1050 <strlen@plt>
lea    (%rbx,%rax,1),%rdi
add    $0x1,%rdi
call   1060 <malloc@plt>
mov    %rax,%r13
lea    0xe57(%rip),%rsi
mov    %rax,%rdi
mov    %r12,%rdx
mov    %r15,%rcx
call   1070 <sprintf@plt>
jmp    1226 <get_full_path+0xd6>
lea    0xe45(%rip),%rdi
call   1030 <getenv@plt>
mov    %rax,%r15
mov    %rax,%rdi
call   1050 <strlen@plt>
mov    %rax,%rbx
mov    %r14,%rdi
call   1050 <strlen@plt>
lea    (%rbx,%rax,1),%rdi
add    $0x2,%rdi
call   1060 <malloc@plt>
mov    %rax,%r13
lea    0xe17(%rip),%rsi
mov    %rax,%rdi
mov    %r15,%rdx
mov    %r14,%rcx
call   1070 <sprintf@plt>
jmp    1226 <get_full_path+0xd6>
mov    %r14,%rdi
call   1050 <strlen@plt>
lea    0x1(%rax),%rdi
call   1060 <malloc@plt>
mov    %rax,%r13
mov    %rax,%rdi
mov    %r14,%rsi
call   1040 <strcpy@plt>
mov    %r13,%rax
nopl   0x0(%rax)
cmp    %r14,%rax
jbe    1290 <get_full_path+0x140>
mov    0x1(%rax),%dl
cmp    $0x2e,%dl
jne    12a0 <get_full_path+0x150>
cmpb   $0x2f,-0x1(%rax)
jne    12a0 <get_full_path+0x150>
mov    (%rax),%bl
cmp    $0x2e,%bl
jne    12c0 <get_full_path+0x170>
cmpb   $0x2f,0x2(%rax)
jne    12a0 <get_full_path+0x150>
lea    0x2(%rax),%rsi
add    $0xfffffffffffffffe,%rax
nopl   0x0(%rax,%rax,1)
lea    -0x1(%rax),%rcx
cmp    %r13,%rax
jbe    1271 <get_full_path+0x121>
cmpb   $0x2f,(%rax)
mov    %rcx,%rax
jne    1260 <get_full_path+0x110>
add    $0x1,%rcx
cmp    %r13,%rcx
jae    1350 <get_full_path+0x200>
mov    %r13,%rcx
jmp    130e <get_full_path+0x1be>
cs nopw 0x0(%rax,%rax,1)
cmpb   $0x2f,(%rax)
je     12e0 <get_full_path+0x190>
jmp    1300 <get_full_path+0x1b0>
nopw   0x0(%rax,%rax,1)
mov    (%rax),%bl
cmp    $0x2e,%bl
jne    12c0 <get_full_path+0x170>
cmpb   $0x2f,-0x1(%rax)
jne    1300 <get_full_path+0x1b0>
cmp    $0x2f,%dl
jne    1300 <get_full_path+0x1b0>
mov    %rax,%rdx
add    $0x1,%rax
add    $0xffffffffffffffff,%rdx
jmp    1319 <get_full_path+0x1c9>
nop
cmp    $0x2f,%bl
jne    1300 <get_full_path+0x1b0>
cmpb   $0x2f,-0x1(%rax)
jne    12e0 <get_full_path+0x190>
lea    -0x1(%rax),%rdx
jmp    1319 <get_full_path+0x1c9>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    0x1(%rax),%dl
test   %dl,%dl
je     1308 <get_full_path+0x1b8>
cmp    $0x2f,%dl
jne    1300 <get_full_path+0x1b0>
mov    %rax,%rsi
nop
cmpb   $0x2f,0x2(%rsi)
lea    0x1(%rsi),%rsi
je     12f0 <get_full_path+0x1a0>
mov    %rax,%rcx
jmp    130e <get_full_path+0x1be>
nop
mov    %rax,%rcx
mov    %rax,%rdx
jmp    1338 <get_full_path+0x1e8>
movb   $0x0,(%rax)
mov    %rax,%rsi
mov    %rsi,%rax
mov    %rcx,%rdx
cmp    %rcx,%rsi
je     1338 <get_full_path+0x1e8>
mov    (%rax),%cl
xor    %esi,%esi
nopl   (%rax)
mov    %cl,(%rdx,%rsi,1)
movzbl 0x1(%rax,%rsi,1),%ecx
add    $0x1,%rsi
test   %cl,%cl
jne    1320 <get_full_path+0x1d0>
lea    (%rdx,%rsi,1),%rcx
movb   $0x0,(%rdx,%rsi,1)
cmpb   $0x0,0x1(%rdx)
je     135c <get_full_path+0x20c>
add    $0x1,%rdx
mov    %rdx,%rax
cmp    %r13,%rdx
jae    1230 <get_full_path+0xe0>
jmp    135c <get_full_path+0x20c>
jne    130e <get_full_path+0x1be>
movb   $0x2f,0x0(%r13)
mov    %r13,%rcx
jmp    130e <get_full_path+0x1be>
mov    %r13,%rax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
ret

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

LLVM IR (-O2):
@.str = [5 x i8] c"HOME\00"
@.str.1 = [5 x i8] c"%s%s\00"
@.str.2 = [4 x i8] c"PWD\00"
@.str.3 = [6 x i8] c"%s/%s\00"
define i8* @get_full_path(i8* %0) {
%2 = load i8, i8* %0
switch i8 %2, label %16 [
i8 126, label %3
i8 47, label %25
]
3: ; preds = %1
%4 = getelementptr inbounds i8, i8* %0, i64 1
%5 = load i8, i8* %4
%6 = icmp eq i8 %5, 47
br i1 %6, label %7, label %16
7: ; preds = %3
%8 = tail call i8* @getenv(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
%9 = tail call i64 @strlen(i8* dereferenceable(1) %8)
%10 = tail call i64 @strlen(i8* %0)
%11 = add i64 %9, 1
%12 = add i64 %11, %10
%13 = tail call i64 @malloc(i64 %12)
%14 = inttoptr i64 %13 to i8*
%15 = tail call i32 @sprintf(i8* dereferenceable(1) %14, i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0), i8* %8, i8* %4)
br label %31
16: ; preds = %1, %3
%17 = tail call i8* @getenv(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.2, i64 0, i64 0))
%18 = tail call i64 @strlen(i8* dereferenceable(1) %17)
%19 = tail call i64 @strlen(i8* %0)
%20 = add i64 %18, 2
%21 = add i64 %20, %19
%22 = tail call i64 @malloc(i64 %21)
%23 = inttoptr i64 %22 to i8*
%24 = tail call i32 @sprintf(i8* dereferenceable(1) %23, i8* dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @.str.3, i64 0, i64 0), i8* %17, i8* %0)
br label %31
25: ; preds = %1
%26 = tail call i64 @strlen(i8* %0)
%27 = add nsw i64 %26, 1
%28 = tail call i64 @malloc(i64 %27)
%29 = inttoptr i64 %28 to i8*
%30 = tail call i32 @strcpy(i8* %29, i8* %0)
br label %31
31: ; preds = %16, %25, %7
%32 = phi i8* [ %14, %7 ], [ %23, %16 ], [ %29, %25 ]
br label %33
33: ; preds = %112, %31
%34 = phi i8* [ undef, %31 ], [ %113, %112 ]
%35 = phi i8* [ %32, %31 ], [ %115, %112 ]
%36 = icmp ugt i8* %35, %0
br i1 %36, label %37, label %82
37: ; preds = %33
%38 = getelementptr inbounds i8, i8* %35, i64 1
%39 = load i8, i8* %38
%40 = icmp eq i8 %39, 46
br i1 %40, label %41, label %66
41: ; preds = %37
%42 = getelementptr inbounds i8, i8* %35, i64 -1
%43 = load i8, i8* %42
%44 = icmp eq i8 %43, 47
br i1 %44, label %45, label %66
45: ; preds = %41
%46 = load i8, i8* %35
%47 = icmp eq i8 %46, 46
br i1 %47, label %48, label %75
48: ; preds = %45
%49 = getelementptr inbounds i8, i8* %35, i64 2
%50 = load i8, i8* %49
%51 = icmp eq i8 %50, 47
br i1 %51, label %52, label %66
52: ; preds = %48
%53 = getelementptr inbounds i8, i8* %35, i64 -2
br label %54
54: ; preds = %54, %52
%55 = phi i8* [ %53, %52 ], [ %60, %54 ]
%56 = load i8, i8* %55
%57 = icmp ne i8 %56, 47
%58 = icmp ugt i8* %55, %32
%59 = and i1 %58, %57
%60 = getelementptr inbounds i8, i8* %55, i64 -1
br i1 %59, label %54, label %61
61: ; preds = %54
%62 = icmp ult i8* %55, %32
br i1 %62, label %95, label %63
63: ; preds = %61
%64 = icmp eq i8* %55, %32
br i1 %64, label %65, label %95
65: ; preds = %63
store i8 47, i8* %32
br label %95
66: ; preds = %37, %41, %48
%67 = load i8, i8* %35
%68 = icmp eq i8 %67, 46
br i1 %68, label %69, label %75
69: ; preds = %66
%70 = getelementptr inbounds i8, i8* %35, i64 -1
%71 = load i8, i8* %70
%72 = icmp eq i8 %71, 47
%73 = icmp eq i8 %39, 47
%74 = select i1 %72, i1 %73, i1 false
br i1 %74, label %99, label %112
75: ; preds = %45, %66
%76 = phi i8 [ %67, %66 ], [ %46, %45 ]
%77 = icmp eq i8 %76, 47
br i1 %77, label %78, label %112
78: ; preds = %75
%79 = getelementptr inbounds i8, i8* %35, i64 -1
%80 = load i8, i8* %79
%81 = icmp eq i8 %80, 47
br i1 %81, label %99, label %85
82: ; preds = %33
%83 = load i8, i8* %35
%84 = icmp eq i8 %83, 47
br i1 %84, label %85, label %112
85: ; preds = %78, %82
%86 = getelementptr inbounds i8, i8* %35, i64 1
%87 = load i8, i8* %86
switch i8 %87, label %112 [
i8 47, label %88
i8 0, label %94
]
88: ; preds = %85, %88
%89 = phi i8* [ %90, %88 ], [ %35, %85 ]
%90 = getelementptr inbounds i8, i8* %89, i64 1
%91 = getelementptr inbounds i8, i8* %89, i64 2
%92 = load i8, i8* %91
%93 = icmp eq i8 %92, 47
br i1 %93, label %88, label %95
94: ; preds = %85
store i8 0, i8* %35
br label %95
95: ; preds = %88, %65, %63, %61, %94
%96 = phi i8* [ %34, %94 ], [ %32, %65 ], [ %55, %63 ], [ %32, %61 ], [ %35, %88 ]
%97 = phi i8* [ %35, %94 ], [ %49, %65 ], [ %49, %63 ], [ %49, %61 ], [ %90, %88 ]
%98 = icmp eq i8* %97, %96
br i1 %98, label %112, label %99
99: ; preds = %69, %78, %95
%100 = phi i8* [ %97, %95 ], [ %38, %69 ], [ %35, %78 ]
%101 = phi i8* [ %96, %95 ], [ %70, %69 ], [ %79, %78 ]
%102 = load i8, i8* %100
br label %103
103: ; preds = %99, %103
%104 = phi i8 [ %109, %103 ], [ %102, %99 ]
%105 = phi i8* [ %107, %103 ], [ %101, %99 ]
%106 = phi i8* [ %108, %103 ], [ %100, %99 ]
store i8 %104, i8* %105
%107 = getelementptr inbounds i8, i8* %105, i64 1
%108 = getelementptr inbounds i8, i8* %106, i64 1
%109 = load i8, i8* %108
%110 = icmp eq i8 %109, 0
br i1 %110, label %111, label %103
111: ; preds = %103
store i8 0, i8* %107
br label %112
112: ; preds = %85, %75, %69, %82, %111, %95
%113 = phi i8* [ %107, %111 ], [ %96, %95 ], [ %35, %82 ], [ %35, %69 ], [ %35, %75 ], [ %35, %85 ]
%114 = phi i8* [ %101, %111 ], [ %96, %95 ], [ %35, %82 ], [ %35, %69 ], [ %35, %75 ], [ %35, %85 ]
%115 = getelementptr inbounds i8, i8* %114, i64 1
%116 = load i8, i8* %115
%117 = icmp ne i8 %116, 0
%118 = icmp uge i8* %115, %32
%119 = and i1 %117, %118
br i1 %119, label %33, label %120
120: ; preds = %112
ret i8* %32
}