int normalize_path(unsigned char *input, int input_len, int win,
                   unsigned char *changed) {
  unsigned char *src;
  unsigned char *dst;
  unsigned char *end;
  int ldst = 0;
  int hitroot = 0;
  int done = 0;
  int relative;
  int trailing;
  changed[0] = '0';
  if (input_len <= 0)
    return 0;
  src = dst = input;
  end = input + (input_len - 1);
  ldst = 1;
  relative = ((*input == '/') || (win && (*input == '\\'))) ? 0 : 1;
  trailing = ((*end == '/') || (win && (*end == '\\'))) ? 1 : 0;
  while (!done && (src <= end) && (dst <= end)) {
    if (win) {
      if (*src == '\\') {
        *src = '/';
        changed[0] = '1';
      }
      if ((src < end) && (*(src + 1) == '\\')) {
        *(src + 1) = '/';
        changed[0] = '1';
      }
    }
    if (src == end) {
      done = 1;
    } else if (*(src + 1) != '/') {
      goto copy;
    }
    if ((src != end) && *src == '/') {
      changed[0] = '1';
      goto copy;
    } else if (*src == '.') {
      if ((dst > input) && (*(dst - 1) == '.')) {
        if (relative && (hitroot || ((dst - 2) <= input))) {
          hitroot = 1;
          goto copy;
        }
        dst -= 3;
        while ((dst > input) && (*dst != '/')) {
          dst--;
        }
        if (dst <= input) {
          hitroot = 1;
          dst = input;
          if (!relative && (src == end)) {
            dst++;
          }
        }
        if (done)
          goto length;
        src++;
        changed[0] = '1';
      } else if (dst == input) {
        changed[0] = '1';
        if (done)
          goto length;
        src++;
      } else if (*(dst - 1) == '/') {
        changed[0] = '1';
        if (done)
          goto length;
        dst--;
        src++;
      }
    } else if (dst > input) {
      hitroot = 0;
    }
  copy:
    if (*src == '/') {
      unsigned char *oldsrc = src;
      while ((src < end) &&
             ((*(src + 1) == '/') || (win && (*(src + 1) == '\\')))) {
        src++;
      }
      if (oldsrc != src)
        changed[0] = '1';
      if (relative && (dst == input)) {
        src++;
        goto length;
      }
    }
    *(dst++) = *(src++);
  length:
    ldst = (dst - input);
  }
  if (!trailing && (dst > input) && *(dst - 1) == '/') {
    ldst--;
    dst--;
  }
  *dst = '\0';
  return ldst;
}


x86 assembly (clang, -O0):
<normalize_path>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x20(%rbp),%rax
movb   $0x30,(%rax)
cmpl   $0x0,-0x14(%rbp)
jg     1144 <normalize_path+0x44>
movl   $0x0,-0x4(%rbp)
jmp    1615 <normalize_path+0x515>
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
movl   $0x1,-0x3c(%rbp)
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x2f,%ecx
mov    %al,-0x59(%rbp)
je     11a5 <normalize_path+0xa5>
xor    %eax,%eax
cmpl   $0x0,-0x18(%rbp)
mov    %al,-0x5a(%rbp)
je     119f <normalize_path+0x9f>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5c,%eax
sete   %al
mov    %al,-0x5a(%rbp)
mov    -0x5a(%rbp),%al
mov    %al,-0x59(%rbp)
mov    -0x59(%rbp),%dl
mov    $0x1,%eax
xor    %ecx,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x48(%rbp)
mov    -0x38(%rbp),%rax
movzbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x2f,%ecx
mov    %al,-0x5b(%rbp)
je     11f2 <normalize_path+0xf2>
xor    %eax,%eax
cmpl   $0x0,-0x18(%rbp)
mov    %al,-0x5c(%rbp)
je     11ec <normalize_path+0xec>
mov    -0x38(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5c,%eax
sete   %al
mov    %al,-0x5c(%rbp)
mov    -0x5c(%rbp),%al
mov    %al,-0x5b(%rbp)
mov    -0x5b(%rbp),%dl
xor    %eax,%eax
mov    $0x1,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x4c(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x44(%rbp)
mov    %al,-0x5d(%rbp)
jne    1235 <normalize_path+0x135>
mov    -0x28(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x5d(%rbp)
ja     1235 <normalize_path+0x135>
mov    -0x30(%rbp),%rax
cmp    -0x38(%rbp),%rax
setbe  %al
mov    %al,-0x5d(%rbp)
mov    -0x5d(%rbp),%al
test   $0x1,%al
jne    1245 <normalize_path+0x145>
jmp    15ca <normalize_path+0x4ca>
cmpl   $0x0,-0x18(%rbp)
je     12a0 <normalize_path+0x1a0>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x5c,%eax
jne    126d <normalize_path+0x16d>
mov    -0x28(%rbp),%rax
movb   $0x2f,(%rax)
mov    -0x20(%rbp),%rax
movb   $0x31,(%rax)
mov    -0x28(%rbp),%rax
cmp    -0x38(%rbp),%rax
jae    129b <normalize_path+0x19b>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x5c,%eax
jne    129b <normalize_path+0x19b>
mov    -0x28(%rbp),%rax
movb   $0x2f,0x1(%rax)
mov    -0x20(%rbp),%rax
movb   $0x31,(%rax)
jmp    12a0 <normalize_path+0x1a0>
mov    -0x28(%rbp),%rax
cmp    -0x38(%rbp),%rax
jne    12ba <normalize_path+0x1ba>
movl   $0x1,-0x44(%rbp)
jmp    12d5 <normalize_path+0x1d5>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x2f,%eax
je     12d0 <normalize_path+0x1d0>
jmp    14c4 <normalize_path+0x3c4>
jmp    12d5 <normalize_path+0x1d5>
mov    -0x28(%rbp),%rax
cmp    -0x38(%rbp),%rax
je     12ff <normalize_path+0x1ff>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2f,%eax
jne    12ff <normalize_path+0x1ff>
mov    -0x20(%rbp),%rax
movb   $0x31,(%rax)
jmp    14c4 <normalize_path+0x3c4>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2e,%eax
jne    14a0 <normalize_path+0x3a0>
mov    -0x30(%rbp),%rax
cmp    -0x10(%rbp),%rax
jbe    141d <normalize_path+0x31d>
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
cmp    $0x2e,%eax
jne    141d <normalize_path+0x31d>
cmpl   $0x0,-0x48(%rbp)
je     1360 <normalize_path+0x260>
cmpl   $0x0,-0x40(%rbp)
jne    1354 <normalize_path+0x254>
mov    -0x30(%rbp),%rax
add    $0xfffffffffffffffe,%rax
cmp    -0x10(%rbp),%rax
ja     1360 <normalize_path+0x260>
movl   $0x1,-0x40(%rbp)
jmp    14c4 <normalize_path+0x3c4>
mov    -0x30(%rbp),%rax
add    $0xfffffffffffffffd,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rcx
xor    %eax,%eax
cmp    -0x10(%rbp),%rcx
mov    %al,-0x5e(%rbp)
jbe    138f <normalize_path+0x28f>
mov    -0x30(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x5e(%rbp)
mov    -0x5e(%rbp),%al
test   $0x1,%al
jne    139f <normalize_path+0x29f>
jmp    13b0 <normalize_path+0x2b0>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
jmp    136c <normalize_path+0x26c>
mov    -0x30(%rbp),%rax
cmp    -0x10(%rbp),%rax
ja     13f6 <normalize_path+0x2f6>
movl   $0x1,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
cmpl   $0x0,-0x48(%rbp)
jne    13f1 <normalize_path+0x2f1>
mov    -0x28(%rbp),%rax
cmp    -0x38(%rbp),%rax
jne    13f1 <normalize_path+0x2f1>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    13f6 <normalize_path+0x2f6>
cmpl   $0x0,-0x44(%rbp)
je     1405 <normalize_path+0x305>
jmp    15b7 <normalize_path+0x4b7>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
movb   $0x31,(%rax)
jmp    149b <normalize_path+0x39b>
mov    -0x30(%rbp),%rax
cmp    -0x10(%rbp),%rax
jne    1452 <normalize_path+0x352>
mov    -0x20(%rbp),%rax
movb   $0x31,(%rax)
cmpl   $0x0,-0x44(%rbp)
je     1441 <normalize_path+0x341>
jmp    15b7 <normalize_path+0x4b7>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1496 <normalize_path+0x396>
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    1491 <normalize_path+0x391>
mov    -0x20(%rbp),%rax
movb   $0x31,(%rax)
cmpl   $0x0,-0x44(%rbp)
je     1479 <normalize_path+0x379>
jmp    15b7 <normalize_path+0x4b7>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1496 <normalize_path+0x396>
jmp    149b <normalize_path+0x39b>
jmp    14ba <normalize_path+0x3ba>
mov    -0x30(%rbp),%rax
cmp    -0x10(%rbp),%rax
jbe    14b5 <normalize_path+0x3b5>
movl   $0x0,-0x40(%rbp)
jmp    14ba <normalize_path+0x3ba>
jmp    14bf <normalize_path+0x3bf>
jmp    14c4 <normalize_path+0x3c4>
mov    -0x28(%rbp),%rax
movzbl (%rax),%eax
cmp    $0x2f,%eax
jne    1595 <normalize_path+0x495>
mov    -0x28(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x28(%rbp),%rcx
xor    %eax,%eax
cmp    -0x38(%rbp),%rcx
mov    %al,-0x5f(%rbp)
jae    1531 <normalize_path+0x431>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0x1,%al
cmp    $0x2f,%ecx
mov    %al,-0x60(%rbp)
je     152b <normalize_path+0x42b>
xor    %eax,%eax
cmpl   $0x0,-0x18(%rbp)
mov    %al,-0x61(%rbp)
je     1525 <normalize_path+0x425>
mov    -0x28(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x5c,%eax
sete   %al
mov    %al,-0x61(%rbp)
mov    -0x61(%rbp),%al
mov    %al,-0x60(%rbp)
mov    -0x60(%rbp),%al
mov    %al,-0x5f(%rbp)
mov    -0x5f(%rbp),%al
test   $0x1,%al
jne    1541 <normalize_path+0x441>
jmp    1552 <normalize_path+0x452>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    14dc <normalize_path+0x3dc>
mov    -0x58(%rbp),%rax
cmp    -0x28(%rbp),%rax
je     1567 <normalize_path+0x467>
mov    -0x20(%rbp),%rax
movb   $0x31,(%rax)
cmpl   $0x0,-0x48(%rbp)
je     1590 <normalize_path+0x490>
mov    -0x30(%rbp),%rax
cmp    -0x10(%rbp),%rax
jne    1590 <normalize_path+0x490>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    15b7 <normalize_path+0x4b7>
jmp    1595 <normalize_path+0x495>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x30(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
mov    %eax,-0x3c(%rbp)
jmp    1205 <normalize_path+0x105>
cmpl   $0x0,-0x4c(%rbp)
jne    1608 <normalize_path+0x508>
mov    -0x30(%rbp),%rax
cmp    -0x10(%rbp),%rax
jbe    1608 <normalize_path+0x508>
mov    -0x30(%rbp),%rax
movzbl -0x1(%rax),%eax
cmp    $0x2f,%eax
jne    1608 <normalize_path+0x508>
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<normalize_path>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
movb   $0x30,(%rcx)
test   %esi,%esi
jle    135e <normalize_path+0x25e>
mov    %rdi,%r9
add    $0xffffffff,%esi
add    %rdi,%rsi
mov    (%rdi),%al
mov    $0x1,%r11b
cmp    $0x2f,%al
je     1135 <normalize_path+0x35>
test   %edx,%edx
setne  %bl
cmp    $0x5c,%al
sete   %r11b
and    %bl,%r11b
mov    (%rsi),%al
mov    $0x0,%r8d
cmp    $0x2f,%al
je     114f <normalize_path+0x4f>
test   %edx,%edx
sete   %bl
cmp    $0x5c,%al
setne  %r8b
or     %bl,%r8b
test   %edx,%edx
setne  %r13b
mov    %r11d,%r15d
xor    $0x1,%r15b
mov    %r9,%rdi
mov    %r9,%r10
xor    %r12d,%r12d
cs nopw 0x0(%rax,%rax,1)
nop
test   %edx,%edx
je     11a0 <normalize_path+0xa0>
cmpb   $0x5c,(%rdi)
jne    117f <normalize_path+0x7f>
movb   $0x2f,(%rdi)
movb   $0x31,(%rcx)
cmp    %rsi,%rdi
jae    11a0 <normalize_path+0xa0>
cmpb   $0x5c,0x1(%rdi)
jne    11a0 <normalize_path+0xa0>
movb   $0x2f,0x1(%rdi)
movb   $0x31,(%rcx)
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmp    %rsi,%rdi
je     1220 <normalize_path+0x120>
xor    %ebp,%ebp
cmpb   $0x2f,0x1(%rdi)
jne    12b0 <normalize_path+0x1b0>
mov    (%rdi),%bl
xor    %ebp,%ebp
cmp    $0x2f,%bl
je     12ab <normalize_path+0x1ab>
cmp    $0x2e,%bl
jne    122c <normalize_path+0x12c>
cmp    %r9,%r10
jbe    123a <normalize_path+0x13a>
cmpb   $0x2e,-0x1(%r10)
jne    123a <normalize_path+0x13a>
test   %r11b,%r11b
jne    11ea <normalize_path+0xea>
test   %r12d,%r12d
jne    1273 <normalize_path+0x173>
lea    -0x2(%r10),%rax
cmp    %r9,%rax
jbe    1273 <normalize_path+0x173>
add    $0xfffffffffffffffd,%r10
cmp    %r9,%r10
jbe    120f <normalize_path+0x10f>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmpb   $0x2f,(%r10)
je     127b <normalize_path+0x17b>
add    $0xffffffffffffffff,%r10
cmp    %r9,%r10
ja     1200 <normalize_path+0x100>
mov    %r15d,%ebx
mov    %r9,%r10
mov    $0x1,%r12d
jmp    127d <normalize_path+0x17d>
nopl   (%rax)
mov    (%rsi),%bl
mov    $0x1,%ebp
cmp    $0x2e,%bl
je     11c3 <normalize_path+0xc3>
cmp    %r9,%r10
mov    $0x0,%eax
cmova  %eax,%r12d
jmp    12b0 <normalize_path+0x1b0>
cmp    %r9,%r10
je     125c <normalize_path+0x15c>
cmpb   $0x2f,-0x1(%r10)
jne    12b0 <normalize_path+0x1b0>
movb   $0x31,(%rcx)
cmp    %rsi,%rdi
je     1333 <normalize_path+0x233>
add    $0xffffffffffffffff,%r10
add    $0x1,%rdi
jmp    12ae <normalize_path+0x1ae>
movb   $0x31,(%rcx)
cmp    %rsi,%rdi
je     1374 <normalize_path+0x274>
add    $0x1,%rdi
xor    %ebp,%ebp
mov    %r9,%r10
jmp    12b0 <normalize_path+0x1b0>
mov    $0x1,%r12d
jmp    12b0 <normalize_path+0x1b0>
mov    $0x1,%bl
mov    %r10,%rax
xor    %r10d,%r10d
cmp    %rsi,%rdi
sete   %r10b
add    %r9,%r10
test   %bl,%bl
cmovne %rax,%r10
cmp    %rsi,%rdi
je     1333 <normalize_path+0x233>
test   %bl,%bl
mov    $0x1,%eax
cmove  %eax,%r12d
add    $0x1,%rdi
movb   $0x31,(%rcx)
xor    %ebp,%ebp
mov    (%rdi),%r14b
cmp    $0x2f,%r14b
jne    1316 <normalize_path+0x216>
mov    %rdi,%rbx
cmp    %rsi,%rdi
jae    12f0 <normalize_path+0x1f0>
mov    %rdi,%rbx
jmp    12d9 <normalize_path+0x1d9>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%rbx
cmp    %rsi,%rbx
jae    12f0 <normalize_path+0x1f0>
movzbl 0x1(%rbx),%eax
cmp    $0x2f,%al
je     12d0 <normalize_path+0x1d0>
cmp    $0x5c,%al
sete   %al
and    %r13b,%al
cmp    $0x1,%al
je     12d0 <normalize_path+0x1d0>
nopl   (%rax)
cmp    %rbx,%rdi
je     12f8 <normalize_path+0x1f8>
movb   $0x31,(%rcx)
cmp    %r9,%r10
sete   %al
test   %al,%r15b
je     1310 <normalize_path+0x210>
mov    %r9,%r10
mov    %rbx,%rdi
test   %ebp,%ebp
je     1321 <normalize_path+0x221>
jmp    1333 <normalize_path+0x233>
nop
mov    (%rbx),%r14b
mov    %rbx,%rdi
mov    %r14b,(%r10)
add    $0x1,%r10
test   %ebp,%ebp
jne    1333 <normalize_path+0x233>
add    $0x1,%rdi
cmp    %rsi,%rdi
ja     1333 <normalize_path+0x233>
cmp    %rsi,%r10
jbe    1170 <normalize_path+0x70>
mov    %r10d,%eax
sub    %r9d,%eax
cmp    %r9,%r10
seta   %cl
and    %cl,%r8b
cmp    $0x1,%r8b
jne    1362 <normalize_path+0x262>
lea    -0x1(%r10),%r9
xor    %ecx,%ecx
cmpb   $0x2f,-0x1(%r10)
sete   %cl
cmovne %r10,%r9
sub    %ecx,%eax
jmp    1365 <normalize_path+0x265>
xor    %eax,%eax
jmp    1369 <normalize_path+0x269>
mov    %r10,%r9
movb   $0x0,(%r9)
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %eax,%eax
jmp    1365 <normalize_path+0x265>

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

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