#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 */
typedef int ptrdiff_t;

/* Variables and functions */
int /*<<< orphan*/ EINVAL;
int /*<<< orphan*/ ENAMETOOLONG;
int /*<<< orphan*/ ENOENT;
char *__rawmemchr(char *, char);
int /*<<< orphan*/ assert(int);
int /*<<< orphan*/ errno;
int /*<<< orphan*/ free(char *);
int /*<<< orphan*/ getcwd(char *, long);
char *malloc(long);
char *mempcpy(char *, char const *, int);
scalar_t__ realloc(char *, size_t);
char *__realpath(const char *name, char *resolved) {
  char *rpath, *dest = NULL;
  const char *start, *end, *rpath_limit;
  long int path_max;
  if (name == NULL) {
    errno = EINVAL;
    return NULL;
  }
  if (name[0] == '\0') {
    errno = ENOENT;
    return NULL;
  }
  path_max = 1024;
  if (resolved == NULL) {
    rpath = malloc(path_max);
    if (rpath == NULL)
      return NULL;
  } else
    rpath = resolved;
  rpath_limit = rpath + path_max;
  if (name[0] != '/') {
    if (!getcwd(rpath, path_max)) {
      rpath[0] = '\0';
      goto error;
    }
    dest = __rawmemchr(rpath, '\0');
  } else {
    rpath[0] = '/';
    dest = rpath + 1;
  }
  for (start = end = name; *start; start = end) {
    while (*start == '/')
      ++start;
    for (end = start; *end && *end != '/'; ++end)
      ;
    if (end - start == 0)
      break;
    else if (end - start == 1 && start[0] == '.')
      ;
    else if (end - start == 2 && start[0] == '.' && start[1] == '.') {
      if (dest > rpath + 1)
        while ((--dest)[-1] != '/')
          ;
    } else {
      size_t new_size;
      if (dest[-1] != '/')
        *dest++ = '/';
      if (dest + (end - start) >= rpath_limit) {
        ptrdiff_t dest_offset = dest - rpath;
        char *new_rpath;
        if (resolved) {
          errno = ENAMETOOLONG;
          if (dest > rpath + 1)
            dest--;
          *dest = '\0';
          goto error;
        }
        new_size = rpath_limit - rpath;
        if (end - start + 1 > path_max)
          new_size += end - start + 1;
        else
          new_size += path_max;
        new_rpath = (char *)realloc(rpath, new_size);
        if (new_rpath == NULL)
          goto error;
        rpath = new_rpath;
        rpath_limit = rpath + new_size;
        dest = rpath + dest_offset;
      }
      dest = mempcpy(dest, start, end - start);
      *dest = '\0';
    }
  }
  if (dest > rpath + 1 && dest[-1] == '/')
    --dest;
  *dest = '\0';
  assert(resolved == NULL || resolved == rpath);
  return rpath;
error:
  assert(resolved == NULL || resolved == rpath);
  if (resolved == NULL)
    free(rpath);
  return NULL;
}


x86 assembly (clang, -O0):
<__realpath>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movq   $0x0,-0x28(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    11b2 <__realpath+0x42>
mov    0x2e3e(%rip),%rax
mov    (%rax),%ecx
mov    0x2e3d(%rip),%rax
mov    %ecx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    1600 <__realpath+0x490>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    11e1 <__realpath+0x71>
mov    0x2df7(%rip),%rax
mov    (%rax),%ecx
mov    0x2e0e(%rip),%rax
mov    %ecx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    1600 <__realpath+0x490>
movq   $0x400,-0x48(%rbp)
cmpq   $0x0,-0x18(%rbp)
jne    121e <__realpath+0xae>
mov    -0x48(%rbp),%rdi
call   1070 <malloc@plt>
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jne    1219 <__realpath+0xa9>
movq   $0x0,-0x8(%rbp)
jmp    1600 <__realpath+0x490>
jmp    1226 <__realpath+0xb6>
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    -0x48(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
je     1278 <__realpath+0x108>
mov    -0x20(%rbp),%rdi
mov    -0x48(%rbp),%rsi
call   1040 <getcwd@plt>
cmp    $0x0,%eax
jne    1264 <__realpath+0xf4>
mov    -0x20(%rbp),%rax
movb   $0x0,(%rax)
jmp    15b9 <__realpath+0x449>
mov    -0x20(%rbp),%rdi
xor    %esi,%esi
call   1060 <__rawmemchr@plt>
mov    %rax,-0x28(%rbp)
jmp    128b <__realpath+0x11b>
mov    -0x20(%rbp),%rax
movb   $0x2f,(%rax)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmpb   $0x0,(%rax)
je     1548 <__realpath+0x3d8>
jmp    12a9 <__realpath+0x139>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    12ca <__realpath+0x15a>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    12a9 <__realpath+0x139>
mov    -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x61(%rbp)
je     12f7 <__realpath+0x187>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x61(%rbp)
mov    -0x61(%rbp),%al
test   $0x1,%al
jne    1307 <__realpath+0x197>
jmp    131d <__realpath+0x1ad>
jmp    130c <__realpath+0x19c>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    12d2 <__realpath+0x162>
mov    -0x38(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
cmp    $0x0,%rax
jne    1337 <__realpath+0x1c7>
jmp    1548 <__realpath+0x3d8>
mov    -0x38(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
cmp    $0x1,%rax
jne    1361 <__realpath+0x1f1>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1361 <__realpath+0x1f1>
jmp    1531 <__realpath+0x3c1>
mov    -0x38(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
cmp    $0x2,%rax
jne    13dc <__realpath+0x26c>
mov    -0x30(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    13dc <__realpath+0x26c>
mov    -0x30(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    13dc <__realpath+0x26c>
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x1,%rcx
cmp    %rcx,%rax
jbe    13d7 <__realpath+0x267>
jmp    13b1 <__realpath+0x241>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x28(%rbp)
movsbl -0x2(%rax),%eax
cmp    $0x2f,%eax
je     13d2 <__realpath+0x262>
jmp    13b1 <__realpath+0x241>
jmp    13d7 <__realpath+0x267>
jmp    152c <__realpath+0x3bc>
mov    -0x28(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
je     13ff <__realpath+0x28f>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movb   $0x2f,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    -0x30(%rbp),%rdx
sub    %rdx,%rcx
add    %rcx,%rax
cmp    -0x40(%rbp),%rax
jb     1507 <__realpath+0x397>
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x54(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1473 <__realpath+0x303>
mov    0x2b95(%rip),%rax
mov    (%rax),%ecx
mov    0x2b9c(%rip),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x1,%rcx
cmp    %rcx,%rax
jbe    1467 <__realpath+0x2f7>
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
jmp    15b9 <__realpath+0x449>
mov    -0x40(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
add    $0x1,%rax
cmp    -0x48(%rbp),%rax
jle    14b7 <__realpath+0x347>
mov    -0x38(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
add    $0x1,%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
jmp    14c3 <__realpath+0x353>
mov    -0x48(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x20(%rbp),%rdi
mov    -0x50(%rbp),%rsi
call   1080 <realloc@plt>
mov    %rax,-0x60(%rbp)
cmpq   $0x0,-0x60(%rbp)
jne    14e4 <__realpath+0x374>
jmp    15b9 <__realpath+0x449>
mov    -0x60(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
add    -0x50(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movslq -0x54(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rdi
mov    -0x30(%rbp),%rsi
mov    -0x38(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,%edx
call   1090 <mempcpy@plt>
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
jmp    1531 <__realpath+0x3c1>
jmp    1536 <__realpath+0x3c6>
jmp    153b <__realpath+0x3cb>
mov    -0x38(%rbp),%rax
mov    %rax,-0x30(%rbp)
jmp    1297 <__realpath+0x127>
mov    -0x28(%rbp),%rax
mov    -0x20(%rbp),%rcx
add    $0x1,%rcx
cmp    %rcx,%rax
jbe    157a <__realpath+0x40a>
mov    -0x28(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    157a <__realpath+0x40a>
mov    -0x28(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
movb   $0x0,(%rax)
mov    $0x1,%al
cmpq   $0x0,-0x18(%rbp)
mov    %al,-0x62(%rbp)
je     159f <__realpath+0x42f>
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
sete   %al
mov    %al,-0x62(%rbp)
mov    -0x62(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1050 <assert@plt>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1600 <__realpath+0x490>
mov    $0x1,%al
cmpq   $0x0,-0x18(%rbp)
mov    %al,-0x63(%rbp)
je     15d7 <__realpath+0x467>
mov    -0x18(%rbp),%rax
cmp    -0x20(%rbp),%rax
sete   %al
mov    %al,-0x63(%rbp)
mov    -0x63(%rbp),%al
and    $0x1,%al
movzbl %al,%edi
call   1050 <assert@plt>
cmpq   $0x0,-0x18(%rbp)
jne    15f8 <__realpath+0x488>
mov    -0x20(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<__realpath>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
test   %rdi,%rdi
je     11b8 <__realpath+0x48>
mov    %rdi,%rbx
mov    (%rdi),%bpl
test   %bpl,%bpl
je     11c1 <__realpath+0x51>
mov    %rsi,%r14
mov    %rsi,%r15
test   %rsi,%rsi
jne    11a8 <__realpath+0x38>
mov    $0x400,%edi
call   1070 <malloc@plt>
mov    %rax,%r15
test   %rax,%rax
je     11d3 <__realpath+0x63>
cmp    $0x2f,%bpl
jne    11db <__realpath+0x6b>
movb   $0x2f,(%r15)
lea    0x1(%r15),%r12
jmp    11fd <__realpath+0x8d>
mov    0x2e19(%rip),%rax
jmp    11c8 <__realpath+0x58>
mov    0x2df8(%rip),%rax
mov    (%rax),%eax
mov    0x2e0f(%rip),%rcx
mov    %eax,(%rcx)
xor    %r15d,%r15d
jmp    1395 <__realpath+0x225>
mov    $0x400,%esi
mov    %r15,%rdi
call   1040 <getcwd@plt>
test   %eax,%eax
je     13a7 <__realpath+0x237>
mov    %r15,%rdi
xor    %esi,%esi
call   1060 <__rawmemchr@plt>
mov    %rax,%r12
mov    (%rbx),%al
test   %al,%al
mov    %r14,(%rsp)
je     135e <__realpath+0x1ee>
lea    0x400(%r15),%r14
jmp    1243 <__realpath+0xd3>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r12,%rdi
mov    %rbx,%rsi
mov    %r13d,%edx
call   1090 <mempcpy@plt>
mov    %rax,%r12
movb   $0x0,(%rax)
mov    (%rbx,%r13,1),%al
add    %r13,%rbx
test   %al,%al
je     135e <__realpath+0x1ee>
mov    %eax,%ecx
cmp    $0x2f,%al
jne    125d <__realpath+0xed>
nopl   0x0(%rax)
movzbl 0x1(%rbx),%ecx
add    $0x1,%rbx
cmp    $0x2f,%cl
je     1250 <__realpath+0xe0>
xor    %r13d,%r13d
mov    %ecx,%eax
test   %al,%al
je     1282 <__realpath+0x112>
cs nopw 0x0(%rax,%rax,1)
cmp    $0x2f,%al
je     1282 <__realpath+0x112>
movzbl 0x1(%rbx,%r13,1),%eax
add    $0x1,%r13
test   %al,%al
jne    1270 <__realpath+0x100>
cmp    $0x1,%r13
je     12a0 <__realpath+0x130>
cmp    $0x2,%r13
je     12b0 <__realpath+0x140>
test   %r13,%r13
jne    12f0 <__realpath+0x180>
jmp    135e <__realpath+0x1ee>
nopl   0x0(%rax,%rax,1)
cmp    $0x2e,%cl
je     1238 <__realpath+0xc8>
jmp    12f0 <__realpath+0x180>
nopw   0x0(%rax,%rax,1)
cmp    $0x2e,%cl
jne    12f0 <__realpath+0x180>
cmpb   $0x2e,0x1(%rbx)
jne    12f0 <__realpath+0x180>
lea    0x1(%r15),%rcx
cmp    %rcx,%r12
jbe    1238 <__realpath+0xc8>
nopl   0x0(%rax,%rax,1)
cmpb   $0x2f,-0x2(%r12)
lea    -0x1(%r12),%r12
jne    12d0 <__realpath+0x160>
jmp    1238 <__realpath+0xc8>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
cmpb   $0x2f,-0x1(%r12)
je     1301 <__realpath+0x191>
movb   $0x2f,(%r12)
add    $0x1,%r12
lea    (%r12,%r13,1),%rax
cmp    %r14,%rax
jb     1220 <__realpath+0xb0>
cmpq   $0x0,(%rsp)
jne    13ac <__realpath+0x23c>
sub    %r15,%r14
lea    0x1(%r13),%rbp
cmp    $0x400,%r13
mov    $0x400,%eax
cmovl  %rax,%rbp
add    %r14,%rbp
mov    %r15,%rdi
mov    %rbp,%rsi
call   1080 <realloc@plt>
test   %rax,%rax
je     13d4 <__realpath+0x264>
sub    %r15,%r12
add    %rax,%rbp
movslq %r12d,%r12
add    %rax,%r12
mov    %rbp,%r14
mov    %rax,%r15
jmp    1220 <__realpath+0xb0>
lea    0x1(%r15),%rax
cmp    %rax,%r12
jbe    1376 <__realpath+0x206>
lea    -0x1(%r12),%rax
cmpb   $0x2f,-0x1(%r12)
cmove  %rax,%r12
mov    (%rsp),%rcx
test   %rcx,%rcx
sete   %al
movb   $0x0,(%r12)
cmp    %rcx,%r15
sete   %cl
or     %al,%cl
movzbl %cl,%edi
call   1050 <assert@plt>
mov    %r15,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %r15,%r12
jmp    13cd <__realpath+0x25d>
mov    0x2c1d(%rip),%rax
mov    (%rax),%eax
mov    0x2c24(%rip),%rcx
mov    %eax,(%rcx)
lea    0x1(%r15),%rax
cmp    %r12,%rax
sbb    $0x0,%r12
mov    (%rsp),%r14
movb   $0x0,(%r12)
jmp    13d8 <__realpath+0x268>
mov    (%rsp),%r14
test   %r14,%r14
sete   %al
cmp    %r14,%r15
sete   %cl
or     %al,%cl
movzbl %cl,%edi
call   1050 <assert@plt>
test   %r14,%r14
jne    11d3 <__realpath+0x63>
mov    %r15,%rdi
call   1030 <free@plt>
jmp    11d3 <__realpath+0x63>

LLVM IR (-O0):
@EINVAL = global i32 0
@errno = global i32 0
@ENOENT = global i32 0
@ENAMETOOLONG = global i32 0
define i8* @__realpath(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i64
%12 = alloca i64
%13 = alloca i32
%14 = alloca i8*
store i8* %0, i8** %4
store i8* %1, i8** %5
store i8* null, i8** %7
%15 = load i8*, i8** %4
%16 = icmp eq i8* %15, null
br i1 %16, label %17, label %19
17: ; preds = %2
%18 = load i32, i32* @EINVAL
store i32 %18, i32* @errno
store i8* null, i8** %3
br label %297
19: ; preds = %2
%20 = load i8*, i8** %4
%21 = getelementptr inbounds i8, i8* %20, i64 0
%22 = load i8, i8* %21
%23 = sext i8 %22 to i32
%24 = icmp eq i32 %23, 0
br i1 %24, label %25, label %27
25: ; preds = %19
%26 = load i32, i32* @ENOENT
store i32 %26, i32* @errno
store i8* null, i8** %3
br label %297
27: ; preds = %19
store i64 1024, i64* %11
%28 = load i8*, i8** %5
%29 = icmp eq i8* %28, null
br i1 %29, label %30, label %37
30: ; preds = %27
%31 = load i64, i64* %11
%32 = call i8* @malloc(i64 %31)
store i8* %32, i8** %6
%33 = load i8*, i8** %6
%34 = icmp eq i8* %33, null
br i1 %34, label %35, label %36
35: ; preds = %30
store i8* null, i8** %3
br label %297
36: ; preds = %30
br label %39
37: ; preds = %27
%38 = load i8*, i8** %5
store i8* %38, i8** %6
br label %39
39: ; preds = %37, %36
%40 = load i8*, i8** %6
%41 = load i64, i64* %11
%42 = getelementptr inbounds i8, i8* %40, i64 %41
store i8* %42, i8** %10
%43 = load i8*, i8** %4
%44 = getelementptr inbounds i8, i8* %43, i64 0
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = icmp ne i32 %46, 47
br i1 %47, label %48, label %59
48: ; preds = %39
%49 = load i8*, i8** %6
%50 = load i64, i64* %11
%51 = call i32 @getcwd(i8* %49, i64 %50)
%52 = icmp ne i32 %51, 0
br i1 %52, label %56, label %53
53: ; preds = %48
%54 = load i8*, i8** %6
%55 = getelementptr inbounds i8, i8* %54, i64 0
store i8 0, i8* %55
br label %280
56: ; preds = %48
%57 = load i8*, i8** %6
%58 = call i8* @__rawmemchr(i8* %57, i8 signext 0)
store i8* %58, i8** %7
br label %64
59: ; preds = %39
%60 = load i8*, i8** %6
%61 = getelementptr inbounds i8, i8* %60, i64 0
store i8 47, i8* %61
%62 = load i8*, i8** %6
%63 = getelementptr inbounds i8, i8* %62, i64 1
store i8* %63, i8** %7
br label %64
64: ; preds = %59, %56
%65 = load i8*, i8** %4
store i8* %65, i8** %9
store i8* %65, i8** %8
br label %66
66: ; preds = %251, %64
%67 = load i8*, i8** %8
%68 = load i8, i8* %67
%69 = icmp ne i8 %68, 0
br i1 %69, label %70, label %253
70: ; preds = %66
br label %71
71: ; preds = %76, %70
%72 = load i8*, i8** %8
%73 = load i8, i8* %72
%74 = sext i8 %73 to i32
%75 = icmp eq i32 %74, 47
br i1 %75, label %76, label %79
76: ; preds = %71
%77 = load i8*, i8** %8
%78 = getelementptr inbounds i8, i8* %77, i32 1
store i8* %78, i8** %8
br label %71
79: ; preds = %71
%80 = load i8*, i8** %8
store i8* %80, i8** %9
br label %81
81: ; preds = %94, %79
%82 = load i8*, i8** %9
%83 = load i8, i8* %82
%84 = sext i8 %83 to i32
%85 = icmp ne i32 %84, 0
br i1 %85, label %86, label %91
86: ; preds = %81
%87 = load i8*, i8** %9
%88 = load i8, i8* %87
%89 = sext i8 %88 to i32
%90 = icmp ne i32 %89, 47
br label %91
91: ; preds = %86, %81
%92 = phi i1 [ false, %81 ], [ %90, %86 ]
br i1 %92, label %93, label %97
93: ; preds = %91
br label %94
94: ; preds = %93
%95 = load i8*, i8** %9
%96 = getelementptr inbounds i8, i8* %95, i32 1
store i8* %96, i8** %9
br label %81
97: ; preds = %91
%98 = load i8*, i8** %9
%99 = load i8*, i8** %8
%100 = ptrtoint i8* %98 to i64
%101 = ptrtoint i8* %99 to i64
%102 = sub i64 %100, %101
%103 = icmp eq i64 %102, 0
br i1 %103, label %104, label %105
104: ; preds = %97
br label %253
105: ; preds = %97
%106 = load i8*, i8** %9
%107 = load i8*, i8** %8
%108 = ptrtoint i8* %106 to i64
%109 = ptrtoint i8* %107 to i64
%110 = sub i64 %108, %109
%111 = icmp eq i64 %110, 1
br i1 %111, label %112, label %119
112: ; preds = %105
%113 = load i8*, i8** %8
%114 = getelementptr inbounds i8, i8* %113, i64 0
%115 = load i8, i8* %114
%116 = sext i8 %115 to i32
%117 = icmp eq i32 %116, 46
br i1 %117, label %118, label %119
118: ; preds = %112
br label %249
119: ; preds = %112, %105
%120 = load i8*, i8** %9
%121 = load i8*, i8** %8
%122 = ptrtoint i8* %120 to i64
%123 = ptrtoint i8* %121 to i64
%124 = sub i64 %122, %123
%125 = icmp eq i64 %124, 2
br i1 %125, label %126, label %154
126: ; preds = %119
%127 = load i8*, i8** %8
%128 = getelementptr inbounds i8, i8* %127, i64 0
%129 = load i8, i8* %128
%130 = sext i8 %129 to i32
%131 = icmp eq i32 %130, 46
br i1 %131, label %132, label %154
132: ; preds = %126
%133 = load i8*, i8** %8
%134 = getelementptr inbounds i8, i8* %133, i64 1
%135 = load i8, i8* %134
%136 = sext i8 %135 to i32
%137 = icmp eq i32 %136, 46
br i1 %137, label %138, label %154
138: ; preds = %132
%139 = load i8*, i8** %7
%140 = load i8*, i8** %6
%141 = getelementptr inbounds i8, i8* %140, i64 1
%142 = icmp ugt i8* %139, %141
br i1 %142, label %143, label %153
143: ; preds = %138
br label %144
144: ; preds = %151, %143
%145 = load i8*, i8** %7
%146 = getelementptr inbounds i8, i8* %145, i32 -1
store i8* %146, i8** %7
%147 = getelementptr inbounds i8, i8* %146, i64 -1
%148 = load i8, i8* %147
%149 = sext i8 %148 to i32
%150 = icmp ne i32 %149, 47
br i1 %150, label %151, label %152
151: ; preds = %144
br label %144
152: ; preds = %144
br label %153
153: ; preds = %152, %138
br label %248
154: ; preds = %132, %126, %119
%155 = load i8*, i8** %7
%156 = getelementptr inbounds i8, i8* %155, i64 -1
%157 = load i8, i8* %156
%158 = sext i8 %157 to i32
%159 = icmp ne i32 %158, 47
br i1 %159, label %160, label %163
160: ; preds = %154
%161 = load i8*, i8** %7
%162 = getelementptr inbounds i8, i8* %161, i32 1
store i8* %162, i8** %7
store i8 47, i8* %161
br label %163
163: ; preds = %160, %154
%164 = load i8*, i8** %7
%165 = load i8*, i8** %9
%166 = load i8*, i8** %8
%167 = ptrtoint i8* %165 to i64
%168 = ptrtoint i8* %166 to i64
%169 = sub i64 %167, %168
%170 = getelementptr inbounds i8, i8* %164, i64 %169
%171 = load i8*, i8** %10
%172 = icmp uge i8* %170, %171
br i1 %172, label %173, label %237
173: ; preds = %163
%174 = load i8*, i8** %7
%175 = load i8*, i8** %6
%176 = ptrtoint i8* %174 to i64
%177 = ptrtoint i8* %175 to i64
%178 = sub i64 %176, %177
%179 = trunc i64 %178 to i32
store i32 %179, i32* %13
%180 = load i8*, i8** %5
%181 = icmp ne i8* %180, null
br i1 %181, label %182, label %193
182: ; preds = %173
%183 = load i32, i32* @ENAMETOOLONG
store i32 %183, i32* @errno
%184 = load i8*, i8** %7
%185 = load i8*, i8** %6
%186 = getelementptr inbounds i8, i8* %185, i64 1
%187 = icmp ugt i8* %184, %186
br i1 %187, label %188, label %191
188: ; preds = %182
%189 = load i8*, i8** %7
%190 = getelementptr inbounds i8, i8* %189, i32 -1
store i8* %190, i8** %7
br label %191
191: ; preds = %188, %182
%192 = load i8*, i8** %7
store i8 0, i8* %192
br label %280
193: ; preds = %173
%194 = load i8*, i8** %10
%195 = load i8*, i8** %6
%196 = ptrtoint i8* %194 to i64
%197 = ptrtoint i8* %195 to i64
%198 = sub i64 %196, %197
store i64 %198, i64* %12
%199 = load i8*, i8** %9
%200 = load i8*, i8** %8
%201 = ptrtoint i8* %199 to i64
%202 = ptrtoint i8* %200 to i64
%203 = sub i64 %201, %202
%204 = add nsw i64 %203, 1
%205 = load i64, i64* %11
%206 = icmp sgt i64 %204, %205
br i1 %206, label %207, label %216
207: ; preds = %193
%208 = load i8*, i8** %9
%209 = load i8*, i8** %8
%210 = ptrtoint i8* %208 to i64
%211 = ptrtoint i8* %209 to i64
%212 = sub i64 %210, %211
%213 = add nsw i64 %212, 1
%214 = load i64, i64* %12
%215 = add i64 %214, %213
store i64 %215, i64* %12
br label %220
216: ; preds = %193
%217 = load i64, i64* %11
%218 = load i64, i64* %12
%219 = add i64 %218, %217
store i64 %219, i64* %12
br label %220
220: ; preds = %216, %207
%221 = load i8*, i8** %6
%222 = load i64, i64* %12
%223 = call i64 @realloc(i8* %221, i64 %222)
%224 = inttoptr i64 %223 to i8*
store i8* %224, i8** %14
%225 = load i8*, i8** %14
%226 = icmp eq i8* %225, null
br i1 %226, label %227, label %228
227: ; preds = %220
br label %280
228: ; preds = %220
%229 = load i8*, i8** %14
store i8* %229, i8** %6
%230 = load i8*, i8** %6
%231 = load i64, i64* %12
%232 = getelementptr inbounds i8, i8* %230, i64 %231
store i8* %232, i8** %10
%233 = load i8*, i8** %6
%234 = load i32, i32* %13
%235 = sext i32 %234 to i64
%236 = getelementptr inbounds i8, i8* %233, i64 %235
store i8* %236, i8** %7
br label %237
237: ; preds = %228, %163
%238 = load i8*, i8** %7
%239 = load i8*, i8** %8
%240 = load i8*, i8** %9
%241 = load i8*, i8** %8
%242 = ptrtoint i8* %240 to i64
%243 = ptrtoint i8* %241 to i64
%244 = sub i64 %242, %243
%245 = trunc i64 %244 to i32
%246 = call i8* @mempcpy(i8* %238, i8* %239, i32 %245)
store i8* %246, i8** %7
%247 = load i8*, i8** %7
store i8 0, i8* %247
br label %248
248: ; preds = %237, %153
br label %249
249: ; preds = %248, %118
br label %250
250: ; preds = %249
br label %251
251: ; preds = %250
%252 = load i8*, i8** %9
store i8* %252, i8** %8
br label %66
253: ; preds = %104, %66
%254 = load i8*, i8** %7
%255 = load i8*, i8** %6
%256 = getelementptr inbounds i8, i8* %255, i64 1
%257 = icmp ugt i8* %254, %256
br i1 %257, label %258, label %267
258: ; preds = %253
%259 = load i8*, i8** %7
%260 = getelementptr inbounds i8, i8* %259, i64 -1
%261 = load i8, i8* %260
%262 = sext i8 %261 to i32
%263 = icmp eq i32 %262, 47
br i1 %263, label %264, label %267
264: ; preds = %258
%265 = load i8*, i8** %7
%266 = getelementptr inbounds i8, i8* %265, i32 -1
store i8* %266, i8** %7
br label %267
267: ; preds = %264, %258, %253
%268 = load i8*, i8** %7
store i8 0, i8* %268
%269 = load i8*, i8** %5
%270 = icmp eq i8* %269, null
br i1 %270, label %275, label %271
271: ; preds = %267
%272 = load i8*, i8** %5
%273 = load i8*, i8** %6
%274 = icmp eq i8* %272, %273
br label %275
275: ; preds = %271, %267
%276 = phi i1 [ true, %267 ], [ %274, %271 ]
%277 = zext i1 %276 to i32
%278 = call i32 @assert(i32 %277)
%279 = load i8*, i8** %6
store i8* %279, i8** %3
br label %297
280: ; preds = %227, %191, %53
%281 = load i8*, i8** %5
%282 = icmp eq i8* %281, null
br i1 %282, label %287, label %283
283: ; preds = %280
%284 = load i8*, i8** %5
%285 = load i8*, i8** %6
%286 = icmp eq i8* %284, %285
br label %287
287: ; preds = %283, %280
%288 = phi i1 [ true, %280 ], [ %286, %283 ]
%289 = zext i1 %288 to i32
%290 = call i32 @assert(i32 %289)
%291 = load i8*, i8** %5
%292 = icmp eq i8* %291, null
br i1 %292, label %293, label %296
293: ; preds = %287
%294 = load i8*, i8** %6
%295 = call i32 @free(i8* %294)
br label %296
296: ; preds = %293, %287
store i8* null, i8** %3
br label %297
297: ; preds = %296, %275, %35, %25, %17
%298 = load i8*, i8** %3
ret i8* %298
}

LLVM IR (-O2):
@EINVAL = global i32 0
@errno = global i32 0
@ENOENT = global i32 0
@ENAMETOOLONG = global i32 0
define i8* @__realpath(i8* %0, i8* %1) {
%3 = icmp eq i8* %0, null
br i1 %3, label %4, label %6
4: ; preds = %2
%5 = load i32, i32* @EINVAL
store i32 %5, i32* @errno
br label %148
6: ; preds = %2
%7 = load i8, i8* %0
%8 = icmp eq i8 %7, 0
br i1 %8, label %9, label %11
9: ; preds = %6
%10 = load i32, i32* @ENOENT
store i32 %10, i32* @errno
br label %148
11: ; preds = %6
%12 = icmp eq i8* %1, null
br i1 %12, label %13, label %16
13: ; preds = %11
%14 = tail call dereferenceable_or_null(1024) i8* @malloc(i64 1024)
%15 = icmp eq i8* %14, null
br i1 %15, label %148, label %16
16: ; preds = %11, %13
%17 = phi i8* [ %14, %13 ], [ %1, %11 ]
%18 = getelementptr inbounds i8, i8* %17, i64 1024
%19 = icmp eq i8 %7, 47
br i1 %19, label %25, label %20
20: ; preds = %16
%21 = tail call i32 @getcwd(i8* %17, i64 1024)
%22 = icmp eq i32 %21, 0
br i1 %22, label %137, label %23
23: ; preds = %20
%24 = tail call i8* @__rawmemchr(i8* %17, i8 signext 0)
br label %27
25: ; preds = %16
store i8 47, i8* %17
%26 = getelementptr inbounds i8, i8* %17, i64 1
br label %27
27: ; preds = %25, %23
%28 = phi i8* [ %24, %23 ], [ %26, %25 ]
%29 = load i8, i8* %0
%30 = icmp eq i8 %29, 0
br i1 %30, label %121, label %31
31: ; preds = %27, %115
%32 = phi i8 [ %116, %115 ], [ %29, %27 ]
%33 = phi i8* [ %119, %115 ], [ %17, %27 ]
%34 = phi i8* [ %118, %115 ], [ %28, %27 ]
%35 = phi i8* [ %117, %115 ], [ %18, %27 ]
%36 = phi i8* [ %48, %115 ], [ %0, %27 ]
%37 = icmp eq i8 %32, 47
br i1 %37, label %41, label %38
38: ; preds = %41, %31
%39 = phi i8 [ %32, %31 ], [ %44, %41 ]
%40 = phi i8* [ %36, %31 ], [ %43, %41 ]
br label %46
41: ; preds = %31, %41
%42 = phi i8* [ %43, %41 ], [ %36, %31 ]
%43 = getelementptr inbounds i8, i8* %42, i64 1
%44 = load i8, i8* %43
%45 = icmp eq i8 %44, 47
br i1 %45, label %41, label %38
46: ; preds = %38, %49
%47 = phi i8 [ %51, %49 ], [ %39, %38 ]
%48 = phi i8* [ %50, %49 ], [ %40, %38 ]
switch i8 %47, label %49 [
i8 0, label %52
i8 47, label %52
]
49: ; preds = %46
%50 = getelementptr inbounds i8, i8* %48, i64 1
%51 = load i8, i8* %50
br label %46
52: ; preds = %46, %46
%53 = ptrtoint i8* %48 to i64
%54 = ptrtoint i8* %40 to i64
%55 = sub i64 %53, %54
switch i64 %55, label %73 [
i64 0, label %121
i64 1, label %56
i64 2, label %58
]
56: ; preds = %52
%57 = icmp eq i8 %39, 46
br i1 %57, label %115, label %73
58: ; preds = %52
%59 = icmp eq i8 %39, 46
br i1 %59, label %60, label %73
60: ; preds = %58
%61 = getelementptr inbounds i8, i8* %40, i64 1
%62 = load i8, i8* %61
%63 = icmp eq i8 %62, 46
br i1 %63, label %64, label %73
64: ; preds = %60
%65 = getelementptr inbounds i8, i8* %33, i64 1
%66 = icmp ugt i8* %34, %65
br i1 %66, label %67, label %115
67: ; preds = %64, %67
%68 = phi i8* [ %69, %67 ], [ %34, %64 ]
%69 = getelementptr inbounds i8, i8* %68, i64 -1
%70 = getelementptr inbounds i8, i8* %68, i64 -2
%71 = load i8, i8* %70
%72 = icmp eq i8 %71, 47
br i1 %72, label %115, label %67
73: ; preds = %56, %52, %60, %58
%74 = getelementptr inbounds i8, i8* %34, i64 -1
%75 = load i8, i8* %74
%76 = icmp eq i8 %75, 47
br i1 %76, label %79, label %77
77: ; preds = %73
%78 = getelementptr inbounds i8, i8* %34, i64 1
store i8 47, i8* %34
br label %79
79: ; preds = %77, %73
%80 = phi i8* [ %78, %77 ], [ %34, %73 ]
%81 = getelementptr inbounds i8, i8* %80, i64 %55
%82 = icmp ult i8* %81, %35
br i1 %82, label %108, label %83
83: ; preds = %79
%84 = ptrtoint i8* %80 to i64
%85 = ptrtoint i8* %33 to i64
%86 = sub i64 %84, %85
br i1 %12, label %93, label %87
87: ; preds = %83
%88 = load i32, i32* @ENAMETOOLONG
store i32 %88, i32* @errno
%89 = getelementptr inbounds i8, i8* %33, i64 1
%90 = icmp ugt i8* %80, %89
%91 = sext i1 %90 to i64
%92 = getelementptr i8, i8* %80, i64 %91
br label %137
93: ; preds = %83
%94 = ptrtoint i8* %35 to i64
%95 = sub i64 %94, %85
%96 = add nsw i64 %55, 1
%97 = icmp slt i64 %55, 1024
%98 = select i1 %97, i64 1024, i64 %96
%99 = add i64 %98, %95
%100 = tail call i64 @realloc(i8* %33, i64 %99)
%101 = inttoptr i64 %100 to i8*
%102 = icmp eq i64 %100, 0
br i1 %102, label %140, label %103
103: ; preds = %93
%104 = getelementptr inbounds i8, i8* %101, i64 %99
%105 = shl i64 %86, 32
%106 = ashr exact i64 %105, 32
%107 = getelementptr inbounds i8, i8* %101, i64 %106
br label %108
108: ; preds = %79, %103
%109 = phi i8* [ %104, %103 ], [ %35, %79 ]
%110 = phi i8* [ %107, %103 ], [ %80, %79 ]
%111 = phi i8* [ %101, %103 ], [ %33, %79 ]
%112 = trunc i64 %55 to i32
%113 = tail call i8* @mempcpy(i8* %110, i8* %40, i32 %112)
store i8 0, i8* %113
%114 = load i8, i8* %48
br label %115
115: ; preds = %67, %108, %64, %56
%116 = phi i8 [ %47, %56 ], [ %47, %64 ], [ %114, %108 ], [ %47, %67 ]
%117 = phi i8* [ %35, %56 ], [ %35, %64 ], [ %109, %108 ], [ %35, %67 ]
%118 = phi i8* [ %34, %56 ], [ %34, %64 ], [ %113, %108 ], [ %69, %67 ]
%119 = phi i8* [ %33, %56 ], [ %33, %64 ], [ %111, %108 ], [ %33, %67 ]
%120 = icmp eq i8 %116, 0
br i1 %120, label %121, label %31
121: ; preds = %115, %52, %27
%122 = phi i8* [ %28, %27 ], [ %34, %52 ], [ %118, %115 ]
%123 = phi i8* [ %17, %27 ], [ %33, %52 ], [ %119, %115 ]
%124 = getelementptr inbounds i8, i8* %123, i64 1
%125 = icmp ugt i8* %122, %124
br i1 %125, label %126, label %131
126: ; preds = %121
%127 = getelementptr inbounds i8, i8* %122, i64 -1
%128 = load i8, i8* %127
%129 = icmp eq i8 %128, 47
%130 = select i1 %129, i8* %127, i8* %122
br label %131
131: ; preds = %126, %121
%132 = phi i8* [ %122, %121 ], [ %130, %126 ]
store i8 0, i8* %132
%133 = icmp eq i8* %123, %1
%134 = select i1 %12, i1 true, i1 %133
%135 = zext i1 %134 to i32
%136 = tail call i32 @assert(i32 %135)
br label %148
137: ; preds = %20, %87
%138 = phi i8* [ %92, %87 ], [ %17, %20 ]
%139 = phi i8* [ %33, %87 ], [ %17, %20 ]
store i8 0, i8* %138
br label %140
140: ; preds = %93, %137
%141 = phi i8* [ %139, %137 ], [ %33, %93 ]
%142 = icmp eq i8* %141, %1
%143 = select i1 %12, i1 true, i1 %142
%144 = zext i1 %143 to i32
%145 = tail call i32 @assert(i32 %144)
br i1 %12, label %146, label %148
146: ; preds = %140
%147 = tail call i32 @free(i8* %141)
br label %148
148: ; preds = %140, %146, %13, %131, %9, %4
%149 = phi i8* [ null, %4 ], [ null, %9 ], [ %123, %131 ], [ null, %13 ], [ null, %146 ], [ null, %140 ]
ret i8* %149
}