void remove_dot_segments(char *path) {
  char *output = path;
  char *input = path;
  while (*input) {
    if (input[0] == '.') {
      if (input[1] == '.' && input[2] == '/') {
        input += 3;
        continue;
      }
      if (input[1] == '/') {
        input += 2;
        continue;
      }
    }
    if (input[0] == '/' && input[1] == '.') {
      if (input[2] == '/') {
        input += 2;
        continue;
      }
      if (!input[2]) {
        input += 1;
        input[0] = '/';
        continue;
      }
    }
    if (input[0] == '/' && input[1] == '.' && input[2] == '.') {
      if (input[3] == '/') {
        input += 3;
        while (output != path && output[-1] != '/')
          output--;
        if (output != path)
          output--;
        continue;
      }
      if (!input[3]) {
        input += 2;
        input[0] = '/';
        while (output != path && output[-1] != '/')
          output--;
        if (output != path)
          output--;
        continue;
      }
    }
    if (input[0] == '.' && !input[1]) {
      input += 1;
      continue;
    }
    if (input[0] == '.' && input[1] == '.' && !input[2]) {
      input += 2;
      continue;
    }
    if (*input == '/') {
      *output++ = *input++;
    }
    while (*input && *input != '/') {
      *output++ = *input++;
    }
  }
  *output = '\0';
}


x86 assembly (clang, -O0):
<remove_dot_segments>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1441 <remove_dot_segments+0x341>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    118f <remove_dot_segments+0x8f>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    1168 <remove_dot_segments+0x68>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2f,%eax
jne    1168 <remove_dot_segments+0x68>
mov    -0x18(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x18(%rbp)
jmp    1118 <remove_dot_segments+0x18>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2f,%eax
jne    118a <remove_dot_segments+0x8a>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    1118 <remove_dot_segments+0x18>
jmp    118f <remove_dot_segments+0x8f>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    11fd <remove_dot_segments+0xfd>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    11fd <remove_dot_segments+0xfd>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2f,%eax
jne    11d2 <remove_dot_segments+0xd2>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    1118 <remove_dot_segments+0x18>
mov    -0x18(%rbp),%rax
cmpb   $0x0,0x2(%rax)
jne    11f8 <remove_dot_segments+0xf8>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movb   $0x2f,(%rax)
jmp    1118 <remove_dot_segments+0x18>
jmp    11fd <remove_dot_segments+0xfd>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    133a <remove_dot_segments+0x23a>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    133a <remove_dot_segments+0x23a>
mov    -0x18(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x2e,%eax
jne    133a <remove_dot_segments+0x23a>
mov    -0x18(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0x2f,%eax
jne    12b0 <remove_dot_segments+0x1b0>
mov    -0x18(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x8(%rbp),%rcx
mov    %al,-0x19(%rbp)
je     1270 <remove_dot_segments+0x170>
mov    -0x10(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
test   $0x1,%al
jne    1280 <remove_dot_segments+0x180>
jmp    1291 <remove_dot_segments+0x191>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    124c <remove_dot_segments+0x14c>
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
je     12ab <remove_dot_segments+0x1ab>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    1118 <remove_dot_segments+0x18>
mov    -0x18(%rbp),%rax
cmpb   $0x0,0x3(%rax)
jne    1335 <remove_dot_segments+0x235>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movb   $0x2f,(%rax)
mov    -0x10(%rbp),%rcx
xor    %eax,%eax
cmp    -0x8(%rbp),%rcx
mov    %al,-0x1a(%rbp)
je     12f5 <remove_dot_segments+0x1f5>
mov    -0x10(%rbp),%rax
movsbl -0x1(%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
test   $0x1,%al
jne    1305 <remove_dot_segments+0x205>
jmp    1316 <remove_dot_segments+0x216>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    12d1 <remove_dot_segments+0x1d1>
mov    -0x10(%rbp),%rax
cmp    -0x8(%rbp),%rax
je     1330 <remove_dot_segments+0x230>
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
jmp    1118 <remove_dot_segments+0x18>
jmp    133a <remove_dot_segments+0x23a>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    1369 <remove_dot_segments+0x269>
mov    -0x18(%rbp),%rax
cmpb   $0x0,0x1(%rax)
jne    1369 <remove_dot_segments+0x269>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1118 <remove_dot_segments+0x18>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    13a9 <remove_dot_segments+0x2a9>
mov    -0x18(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x2e,%eax
jne    13a9 <remove_dot_segments+0x2a9>
mov    -0x18(%rbp),%rax
cmpb   $0x0,0x2(%rax)
jne    13a9 <remove_dot_segments+0x2a9>
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    1118 <remove_dot_segments+0x18>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
jne    13db <remove_dot_segments+0x2db>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13e0 <remove_dot_segments+0x2e0>
mov    -0x18(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1b(%rbp)
je     1405 <remove_dot_segments+0x305>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2f,%eax
setne  %al
mov    %al,-0x1b(%rbp)
mov    -0x1b(%rbp),%al
test   $0x1,%al
jne    1415 <remove_dot_segments+0x315>
jmp    143c <remove_dot_segments+0x33c>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    13e0 <remove_dot_segments+0x2e0>
jmp    1118 <remove_dot_segments+0x18>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<remove_dot_segments>:
mov    %rdi,%r8
mov    %rdi,%rdx
cs nopw 0x0(%rax,%rax,1)
mov    %rdx,%rcx
mov    (%rdx),%sil
cs nopw 0x0(%rax,%rax,1)
mov    %rcx,%rdx
cmp    $0x2e,%sil
je     1160 <remove_dot_segments+0x60>
cmp    $0x2f,%sil
jne    1190 <remove_dot_segments+0x90>
lea    0x1(%rdx),%rax
cmpb   $0x2e,0x1(%rdx)
jne    11f0 <remove_dot_segments+0xf0>
lea    0x2(%rdx),%rcx
movzbl 0x2(%rdx),%esi
cmp    $0x2f,%sil
je     1120 <remove_dot_segments+0x20>
test   %sil,%sil
jne    11ab <remove_dot_segments+0xab>
movb   $0x2f,(%rax)
mov    $0x2f,%sil
mov    %rax,%rcx
jmp    1120 <remove_dot_segments+0x20>
nopl   0x0(%rax,%rax,1)
lea    0x1(%rdx),%rcx
movzbl 0x1(%rdx),%esi
test   %sil,%sil
je     1120 <remove_dot_segments+0x20>
cmp    $0x2e,%sil
jne    119b <remove_dot_segments+0x9b>
cmpb   $0x2f,0x2(%rdx)
je     1220 <remove_dot_segments+0x120>
lea    0x2(%rdx),%rcx
xor    %esi,%esi
cmpb   $0x0,0x2(%rdx)
je     1120 <remove_dot_segments+0x20>
jmp    11a6 <remove_dot_segments+0xa6>
nopl   0x0(%rax,%rax,1)
test   %sil,%sil
je     126b <remove_dot_segments+0x16b>
jmp    11a6 <remove_dot_segments+0xa6>
mov    $0x2,%eax
cmp    $0x2f,%sil
je     1225 <remove_dot_segments+0x125>
mov    %rdx,%rax
jmp    11f8 <remove_dot_segments+0xf8>
cmpb   $0x2e,0x2(%rdx)
jne    11f0 <remove_dot_segments+0xf0>
mov    0x3(%rdx),%cl
test   %cl,%cl
je     122d <remove_dot_segments+0x12d>
cmp    $0x2f,%cl
jne    11f0 <remove_dot_segments+0xf0>
add    $0x3,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r8,%rax
cmp    %rdi,%r8
je     1258 <remove_dot_segments+0x158>
lea    -0x1(%rax),%r8
cmpb   $0x2f,-0x1(%rax)
jne    11d0 <remove_dot_segments+0xd0>
jmp    1252 <remove_dot_segments+0x152>
nopl   0x0(%rax,%rax,1)
movb   $0x2f,(%r8)
add    $0x1,%r8
mov    %rax,%rdx
nopl   0x0(%rax,%rax,1)
movzbl (%rdx),%eax
test   %al,%al
je     1110 <remove_dot_segments+0x10>
cmp    $0x2f,%al
je     1110 <remove_dot_segments+0x10>
add    $0x1,%rdx
mov    %al,(%r8)
add    $0x1,%r8
jmp    1200 <remove_dot_segments+0x100>
mov    $0x3,%eax
add    %rax,%rdx
jmp    1110 <remove_dot_segments+0x10>
add    $0x2,%rdx
movb   $0x2f,(%rdx)
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    %r8,%rax
cmp    %rdi,%r8
je     1258 <remove_dot_segments+0x158>
lea    -0x1(%rax),%r8
cmpb   $0x2f,-0x1(%rax)
jne    1240 <remove_dot_segments+0x140>
add    $0x1,%r8
jmp    125b <remove_dot_segments+0x15b>
mov    %rdi,%r8
xor    %ecx,%ecx
cmp    %rdi,%rax
setne  %cl
sub    %rcx,%r8
jmp    1110 <remove_dot_segments+0x10>
movb   $0x0,(%r8)
ret

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

LLVM IR (-O2):
define void @remove_dot_segments(i8* %0) {
%2 = ptrtoint i8* %0 to i64
br label %3
3: ; preds = %73, %1
%4 = phi i8* [ %0, %1 ], [ %74, %73 ]
%5 = phi i8* [ %0, %1 ], [ %75, %73 ]
%6 = ptrtoint i8* %4 to i64
br label %7
7: ; preds = %23, %3
%8 = phi i8* [ %5, %3 ], [ %25, %23 ]
%9 = load i8, i8* %8
br label %10
10: ; preds = %16, %7
%11 = phi i8 [ %9, %7 ], [ %17, %16 ]
%12 = phi i8* [ %8, %7 ], [ %18, %16 ]
switch i8 %11, label %82 [
i8 0, label %92
i8 46, label %13
i8 47, label %26
]
13: ; preds = %10
%14 = getelementptr inbounds i8, i8* %12, i64 1
%15 = load i8, i8* %14
switch i8 %15, label %82 [
i8 46, label %19
i8 47, label %23
i8 0, label %16
]
16: ; preds = %13, %33, %30, %76
%17 = phi i8 [ 0, %76 ], [ %32, %30 ], [ 47, %33 ], [ %15, %13 ]
%18 = phi i8* [ %77, %76 ], [ %31, %30 ], [ %27, %33 ], [ %14, %13 ]
br label %10
19: ; preds = %13
%20 = getelementptr inbounds i8, i8* %12, i64 2
%21 = load i8, i8* %20
%22 = icmp eq i8 %21, 47
br i1 %22, label %23, label %76
23: ; preds = %13, %19
%24 = phi i64 [ 3, %19 ], [ 2, %13 ]
%25 = getelementptr inbounds i8, i8* %12, i64 %24
br label %7
26: ; preds = %10
%27 = getelementptr inbounds i8, i8* %12, i64 1
%28 = load i8, i8* %27
%29 = icmp eq i8 %28, 46
br i1 %29, label %30, label %80
30: ; preds = %26
%31 = getelementptr inbounds i8, i8* %12, i64 2
%32 = load i8, i8* %31
switch i8 %32, label %34 [
i8 47, label %16
i8 0, label %33
]
33: ; preds = %30
store i8 47, i8* %27
br label %16
34: ; preds = %30
%35 = getelementptr inbounds i8, i8* %12, i64 2
%36 = load i8, i8* %35
%37 = icmp eq i8 %36, 46
br i1 %37, label %38, label %80
38: ; preds = %34
%39 = getelementptr inbounds i8, i8* %12, i64 3
%40 = load i8, i8* %39
switch i8 %40, label %80 [
i8 47, label %41
i8 0, label %57
]
41: ; preds = %38
%42 = getelementptr i8, i8* %4, i64 %2
%43 = sub i64 0, %6
%44 = getelementptr i8, i8* %42, i64 %43
br label %45
45: ; preds = %41, %48
%46 = phi i8* [ %49, %48 ], [ %4, %41 ]
%47 = icmp eq i8* %46, %0
br i1 %47, label %52, label %48
48: ; preds = %45
%49 = getelementptr inbounds i8, i8* %46, i64 -1
%50 = load i8, i8* %49
%51 = icmp eq i8 %50, 47
br i1 %51, label %52, label %45
52: ; preds = %45, %48
%53 = phi i8* [ %44, %45 ], [ %46, %48 ]
%54 = xor i1 %47, true
%55 = sext i1 %54 to i64
%56 = getelementptr i8, i8* %53, i64 %55
br label %73
57: ; preds = %38
store i8 47, i8* %35
%58 = getelementptr i8, i8* %4, i64 %2
%59 = sub i64 0, %6
%60 = getelementptr i8, i8* %58, i64 %59
br label %61
61: ; preds = %64, %57
%62 = phi i8* [ %4, %57 ], [ %65, %64 ]
%63 = icmp eq i8* %62, %0
br i1 %63, label %68, label %64
64: ; preds = %61
%65 = getelementptr inbounds i8, i8* %62, i64 -1
%66 = load i8, i8* %65
%67 = icmp eq i8 %66, 47
br i1 %67, label %68, label %61
68: ; preds = %61, %64
%69 = phi i8* [ %60, %61 ], [ %62, %64 ]
%70 = xor i1 %63, true
%71 = sext i1 %70 to i64
%72 = getelementptr i8, i8* %69, i64 %71
br label %73
73: ; preds = %85, %85, %68, %52
%74 = phi i8* [ %56, %52 ], [ %72, %68 ], [ %86, %85 ], [ %86, %85 ]
%75 = phi i8* [ %39, %52 ], [ %35, %68 ], [ %87, %85 ], [ %87, %85 ]
br label %3
76: ; preds = %19
%77 = getelementptr inbounds i8, i8* %12, i64 2
%78 = load i8, i8* %77
%79 = icmp eq i8 %78, 0
br i1 %79, label %16, label %82
80: ; preds = %26, %38, %34
%81 = getelementptr inbounds i8, i8* %4, i64 1
store i8 47, i8* %4
br label %82
82: ; preds = %13, %76, %10, %80
%83 = phi i8* [ %81, %80 ], [ %4, %10 ], [ %4, %76 ], [ %4, %13 ]
%84 = phi i8* [ %27, %80 ], [ %12, %10 ], [ %12, %76 ], [ %12, %13 ]
br label %85
85: ; preds = %82, %89
%86 = phi i8* [ %91, %89 ], [ %83, %82 ]
%87 = phi i8* [ %90, %89 ], [ %84, %82 ]
%88 = load i8, i8* %87
switch i8 %88, label %89 [
i8 0, label %73
i8 47, label %73
]
89: ; preds = %85
%90 = getelementptr inbounds i8, i8* %87, i64 1
%91 = getelementptr inbounds i8, i8* %86, i64 1
store i8 %88, i8* %86
br label %85
92: ; preds = %10
store i8 0, i8* %4
ret void
}