void clean_spaces(char *line) {
  char *s, *d;
  int skip_spaces = 1;
  s = line;
  d = line;
  while (*s) {
    if ((*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') && skip_spaces) {
      s++;
      continue;
    }
    skip_spaces = 0;
    if (*s == '\t' || *s == '\n' || *s == '\r')
      *s = ' ';
    if (*s == ' ')
      skip_spaces = 1;
    *d = *s;
    s++;
    d++;
  }
  *d = '\0';
}


x86 assembly (clang, -O0):
<clean_spaces>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     1205 <clean_spaces+0x105>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
je     116c <clean_spaces+0x6c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
je     116c <clean_spaces+0x6c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
je     116c <clean_spaces+0x6c>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xd,%eax
jne    1187 <clean_spaces+0x87>
cmpl   $0x0,-0x1c(%rbp)
je     1187 <clean_spaces+0x87>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    111f <clean_spaces+0x1f>
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x9,%eax
je     11be <clean_spaces+0xbe>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
je     11be <clean_spaces+0xbe>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xd,%eax
jne    11c5 <clean_spaces+0xc5>
mov    -0x10(%rbp),%rax
movb   $0x20,(%rax)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x20,%eax
jne    11dc <clean_spaces+0xdc>
movl   $0x1,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%cl
mov    -0x18(%rbp),%rax
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    111f <clean_spaces+0x1f>
mov    -0x18(%rbp),%rax
movb   $0x0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<clean_spaces>:
mov    $0x1,%edx
mov    $0x2600,%r8d
mov    %rdi,%rcx
jmp    1114 <clean_spaces+0x14>
test   %edx,%edx
je     1134 <clean_spaces+0x34>
add    $0x1,%rdi
movzbl -0x1(%rdi),%esi
lea    -0x9(%rsi),%eax
cmp    $0x2,%al
jb     1110 <clean_spaces+0x10>
cmp    $0x20,%sil
je     1110 <clean_spaces+0x10>
test   %sil,%sil
je     115d <clean_spaces+0x5d>
cmp    $0xd,%sil
je     1110 <clean_spaces+0x10>
cmp    $0xd,%sil
ja     114b <clean_spaces+0x4b>
movzbl %sil,%eax
bt     %rax,%r8
jae    114b <clean_spaces+0x4b>
movb   $0x20,-0x1(%rdi)
mov    $0x20,%sil
xor    %edx,%edx
cmp    $0x20,%sil
sete   %dl
mov    %sil,(%rcx)
add    $0x1,%rcx
jmp    1114 <clean_spaces+0x14>
movb   $0x0,(%rcx)
ret

LLVM IR (-O0):
define void @clean_spaces(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
store i8* %0, i8** %2
store i32 1, i32* %5
%6 = load i8*, i8** %2
store i8* %6, i8** %3
%7 = load i8*, i8** %2
store i8* %7, i8** %4
br label %8
8: ; preds = %61, %35, %1
%9 = load i8*, i8** %3
%10 = load i8, i8* %9
%11 = icmp ne i8 %10, 0
br i1 %11, label %12, label %69
12: ; preds = %8
%13 = load i8*, i8** %3
%14 = load i8, i8* %13
%15 = sext i8 %14 to i32
%16 = icmp eq i32 %15, 32
br i1 %16, label %32, label %17
17: ; preds = %12
%18 = load i8*, i8** %3
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
%21 = icmp eq i32 %20, 9
br i1 %21, label %32, label %22
22: ; preds = %17
%23 = load i8*, i8** %3
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp eq i32 %25, 10
br i1 %26, label %32, label %27
27: ; preds = %22
%28 = load i8*, i8** %3
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = icmp eq i32 %30, 13
br i1 %31, label %32, label %38
32: ; preds = %27, %22, %17, %12
%33 = load i32, i32* %5
%34 = icmp ne i32 %33, 0
br i1 %34, label %35, label %38
35: ; preds = %32
%36 = load i8*, i8** %3
%37 = getelementptr inbounds i8, i8* %36, i32 1
store i8* %37, i8** %3
br label %8
38: ; preds = %32, %27
store i32 0, i32* %5
%39 = load i8*, i8** %3
%40 = load i8, i8* %39
%41 = sext i8 %40 to i32
%42 = icmp eq i32 %41, 9
br i1 %42, label %53, label %43
43: ; preds = %38
%44 = load i8*, i8** %3
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = icmp eq i32 %46, 10
br i1 %47, label %53, label %48
48: ; preds = %43
%49 = load i8*, i8** %3
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 13
br i1 %52, label %53, label %55
53: ; preds = %48, %43, %38
%54 = load i8*, i8** %3
store i8 32, i8* %54
br label %55
55: ; preds = %53, %48
%56 = load i8*, i8** %3
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp eq i32 %58, 32
br i1 %59, label %60, label %61
60: ; preds = %55
store i32 1, i32* %5
br label %61
61: ; preds = %60, %55
%62 = load i8*, i8** %3
%63 = load i8, i8* %62
%64 = load i8*, i8** %4
store i8 %63, i8* %64
%65 = load i8*, i8** %3
%66 = getelementptr inbounds i8, i8* %65, i32 1
store i8* %66, i8** %3
%67 = load i8*, i8** %4
%68 = getelementptr inbounds i8, i8* %67, i32 1
store i8* %68, i8** %4
br label %8
69: ; preds = %8
%70 = load i8*, i8** %4
store i8 0, i8* %70
ret void
}

LLVM IR (-O2):
define void @clean_spaces(i8* nocapture %0) {
br label %2
2: ; preds = %19, %1
%3 = phi i8* [ %23, %19 ], [ %0, %1 ]
%4 = phi i8* [ %24, %19 ], [ %0, %1 ]
%5 = phi i32 [ %22, %19 ], [ 1, %1 ]
%6 = icmp eq i32 %5, 0
%7 = icmp ne i32 %5, 0
br label %8
8: ; preds = %2, %15
%9 = phi i8* [ %16, %15 ], [ %3, %2 ]
%10 = load i8, i8* %9
switch i8 %10, label %11 [
i8 0, label %25
i8 32, label %14
i8 9, label %14
i8 10, label %14
]
11: ; preds = %8
%12 = icmp eq i8 %10, 13
%13 = select i1 %12, i1 %7, i1 false
br i1 %13, label %15, label %17
14: ; preds = %8, %8, %8
br i1 %6, label %17, label %15
15: ; preds = %11, %14
%16 = getelementptr inbounds i8, i8* %9, i64 1
br label %8
17: ; preds = %14, %11
switch i8 %10, label %19 [
i8 9, label %18
i8 10, label %18
i8 13, label %18
]
18: ; preds = %17, %17, %17
store i8 32, i8* %9
br label %19
19: ; preds = %17, %18
%20 = phi i8 [ %10, %17 ], [ 32, %18 ]
%21 = icmp eq i8 %20, 32
%22 = zext i1 %21 to i32
store i8 %20, i8* %4
%23 = getelementptr inbounds i8, i8* %9, i64 1
%24 = getelementptr inbounds i8, i8* %4, i64 1
br label %2
25: ; preds = %8
store i8 0, i8* %4
ret void
}