void head(char *s) {
  int i = 0, j, k;
  for (i = 0; s[i] == 32; i++)
    ;
  if (i == 0) {
    while (s[i] != '\0')
      i++;
    for (k = i - 1; s[k] == 32; k--)
      ;
    s[k + 1] = '\0';
  } else {
    for (j = i; s[j] != '\0'; j++)
      s[j - i] = s[j];
    while (s[i] != '\0')
      i++;
    for (k = i - 1; s[k] == 32; k--)
      ;
    s[k + 1] = '\0';
  }
}


x86 assembly (clang, -O0):
<head>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jne    113e <head+0x3e>
jmp    1130 <head+0x30>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1116 <head+0x16>
cmpl   $0x0,-0xc(%rbp)
jne    11b7 <head+0xb7>
jmp    114d <head+0x4d>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1170 <head+0x70>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    114d <head+0x4d>
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jne    11a1 <head+0xa1>
jmp    1193 <head+0x93>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1179 <head+0x79>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1265 <head+0x165>
mov    -0xc(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     11fb <head+0xfb>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
sub    -0xc(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    11bd <head+0xbd>
jmp    1200 <head+0x100>
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1223 <head+0x123>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1200 <head+0x100>
mov    -0xc(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jne    1254 <head+0x154>
jmp    1246 <head+0x146>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    122c <head+0x12c>
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<head>:
mov    $0x2,%eax
mov    $0xffffffffffffffff,%rcx
nopl   0x0(%rax)
add    $0xffffffff,%eax
cmpb   $0x20,0x1(%rdi,%rcx,1)
lea    0x1(%rcx),%rcx
je     1110 <head+0x10>
test   %ecx,%ecx
je     1190 <head+0x90>
mov    %ecx,%edx
mov    (%rdi,%rdx,1),%r8b
test   %r8b,%r8b
je     1158 <head+0x58>
movslq %ecx,%r9
add    $0x1,%r9
mov    %rdi,%rdx
nopw   0x0(%rax,%rax,1)
mov    %r8b,(%rdx)
mov    %r9d,%esi
movzbl (%rdi,%rsi,1),%r8d
add    $0x1,%rdx
add    $0x1,%r9
test   %r8b,%r8b
jne    1140 <head+0x40>
neg    %eax
mov    %ecx,%ecx
add    %rdi,%rcx
nop
add    $0x1,%eax
cmpb   $0x0,(%rcx)
lea    0x1(%rcx),%rcx
jne    1160 <head+0x60>
movslq %eax,%rcx
add    $0x1,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    -0x1(%rcx),%rax
cmpb   $0x20,-0x2(%rdi,%rcx,1)
mov    %rax,%rcx
je     1180 <head+0x80>
jmp    11ce <head+0xce>
mov    $0xffffffff,%eax
mov    %rdi,%rcx
nopl   0x0(%rax,%rax,1)
add    $0x1,%eax
cmpb   $0x0,(%rcx)
lea    0x1(%rcx),%rcx
jne    11a0 <head+0xa0>
movslq %eax,%rcx
add    $0x1,%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    -0x1(%rcx),%rax
cmpb   $0x20,-0x2(%rdi,%rcx,1)
mov    %rax,%rcx
je     11c0 <head+0xc0>
cltq
movb   $0x0,(%rdi,%rax,1)
ret

LLVM IR (-O0):
define void @head(i8* %0) {
%2 = alloca i8*
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i8* %0, i8** %2
store i32 0, i32* %3
store i32 0, i32* %3
br label %6
6: ; preds = %15, %1
%7 = load i8*, i8** %2
%8 = load i32, i32* %3
%9 = sext i32 %8 to i64
%10 = getelementptr inbounds i8, i8* %7, i64 %9
%11 = load i8, i8* %10
%12 = sext i8 %11 to i32
%13 = icmp eq i32 %12, 32
br i1 %13, label %14, label %18
14: ; preds = %6
br label %15
15: ; preds = %14
%16 = load i32, i32* %3
%17 = add nsw i32 %16, 1
store i32 %17, i32* %3
br label %6
18: ; preds = %6
%19 = load i32, i32* %3
%20 = icmp eq i32 %19, 0
br i1 %20, label %21, label %54
21: ; preds = %18
br label %22
22: ; preds = %30, %21
%23 = load i8*, i8** %2
%24 = load i32, i32* %3
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i8, i8* %23, i64 %25
%27 = load i8, i8* %26
%28 = sext i8 %27 to i32
%29 = icmp ne i32 %28, 0
br i1 %29, label %30, label %33
30: ; preds = %22
%31 = load i32, i32* %3
%32 = add nsw i32 %31, 1
store i32 %32, i32* %3
br label %22
33: ; preds = %22
%34 = load i32, i32* %3
%35 = sub nsw i32 %34, 1
store i32 %35, i32* %5
br label %36
36: ; preds = %45, %33
%37 = load i8*, i8** %2
%38 = load i32, i32* %5
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8, i8* %37, i64 %39
%41 = load i8, i8* %40
%42 = sext i8 %41 to i32
%43 = icmp eq i32 %42, 32
br i1 %43, label %44, label %48
44: ; preds = %36
br label %45
45: ; preds = %44
%46 = load i32, i32* %5
%47 = add nsw i32 %46, -1
store i32 %47, i32* %5
br label %36
48: ; preds = %36
%49 = load i8*, i8** %2
%50 = load i32, i32* %5
%51 = add nsw i32 %50, 1
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds i8, i8* %49, i64 %52
store i8 0, i8* %53
br label %112
54: ; preds = %18
%55 = load i32, i32* %3
store i32 %55, i32* %4
br label %56
56: ; preds = %76, %54
%57 = load i8*, i8** %2
%58 = load i32, i32* %4
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8, i8* %57, i64 %59
%61 = load i8, i8* %60
%62 = sext i8 %61 to i32
%63 = icmp ne i32 %62, 0
br i1 %63, label %64, label %79
64: ; preds = %56
%65 = load i8*, i8** %2
%66 = load i32, i32* %4
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i8, i8* %65, i64 %67
%69 = load i8, i8* %68
%70 = load i8*, i8** %2
%71 = load i32, i32* %4
%72 = load i32, i32* %3
%73 = sub nsw i32 %71, %72
%74 = sext i32 %73 to i64
%75 = getelementptr inbounds i8, i8* %70, i64 %74
store i8 %69, i8* %75
br label %76
76: ; preds = %64
%77 = load i32, i32* %4
%78 = add nsw i32 %77, 1
store i32 %78, i32* %4
br label %56
79: ; preds = %56
br label %80
80: ; preds = %88, %79
%81 = load i8*, i8** %2
%82 = load i32, i32* %3
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds i8, i8* %81, i64 %83
%85 = load i8, i8* %84
%86 = sext i8 %85 to i32
%87 = icmp ne i32 %86, 0
br i1 %87, label %88, label %91
88: ; preds = %80
%89 = load i32, i32* %3
%90 = add nsw i32 %89, 1
store i32 %90, i32* %3
br label %80
91: ; preds = %80
%92 = load i32, i32* %3
%93 = sub nsw i32 %92, 1
store i32 %93, i32* %5
br label %94
94: ; preds = %103, %91
%95 = load i8*, i8** %2
%96 = load i32, i32* %5
%97 = sext i32 %96 to i64
%98 = getelementptr inbounds i8, i8* %95, i64 %97
%99 = load i8, i8* %98
%100 = sext i8 %99 to i32
%101 = icmp eq i32 %100, 32
br i1 %101, label %102, label %106
102: ; preds = %94
br label %103
103: ; preds = %102
%104 = load i32, i32* %5
%105 = add nsw i32 %104, -1
store i32 %105, i32* %5
br label %94
106: ; preds = %94
%107 = load i8*, i8** %2
%108 = load i32, i32* %5
%109 = add nsw i32 %108, 1
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds i8, i8* %107, i64 %110
store i8 0, i8* %111
br label %112
112: ; preds = %106, %48
ret void
}

LLVM IR (-O2):
define void @head(i8* nocapture %0) {
br label %2
2: ; preds = %2, %1
%3 = phi i64 [ %7, %2 ], [ 0, %1 ]
%4 = getelementptr inbounds i8, i8* %0, i64 %3
%5 = load i8, i8* %4
%6 = icmp eq i8 %5, 32
%7 = add nuw i64 %3, 1
br i1 %6, label %2, label %8
8: ; preds = %2
%9 = trunc i64 %3 to i32
%10 = icmp eq i32 %9, 0
br i1 %10, label %19, label %11
11: ; preds = %8
%12 = and i64 %3, 4294967295
%13 = getelementptr inbounds i8, i8* %0, i64 %12
%14 = load i8, i8* %13
%15 = icmp eq i8 %14, 0
br i1 %15, label %44, label %16
16: ; preds = %11
%17 = shl i64 %3, 32
%18 = ashr exact i64 %17, 32
br label %34
19: ; preds = %8, %19
%20 = phi i64 [ %24, %19 ], [ 0, %8 ]
%21 = getelementptr inbounds i8, i8* %0, i64 %20
%22 = load i8, i8* %21
%23 = icmp eq i8 %22, 0
%24 = add nuw i64 %20, 1
br i1 %23, label %25, label %19
25: ; preds = %19
%26 = shl i64 %20, 32
%27 = ashr exact i64 %26, 32
br label %28
28: ; preds = %25, %28
%29 = phi i64 [ %27, %25 ], [ %30, %28 ]
%30 = add nsw i64 %29, -1
%31 = getelementptr inbounds i8, i8* %0, i64 %30
%32 = load i8, i8* %31
%33 = icmp eq i8 %32, 32
br i1 %33, label %28, label %60
34: ; preds = %16, %34
%35 = phi i64 [ %18, %16 ], [ %39, %34 ]
%36 = phi i8 [ %14, %16 ], [ %42, %34 ]
%37 = sub nuw nsw i64 %35, %18
%38 = getelementptr inbounds i8, i8* %0, i64 %37
store i8 %36, i8* %38
%39 = add i64 %35, 1
%40 = and i64 %39, 4294967295
%41 = getelementptr inbounds i8, i8* %0, i64 %40
%42 = load i8, i8* %41
%43 = icmp eq i8 %42, 0
br i1 %43, label %44, label %34
44: ; preds = %34, %11
br label %45
45: ; preds = %44, %45
%46 = phi i64 [ %50, %45 ], [ %12, %44 ]
%47 = getelementptr inbounds i8, i8* %0, i64 %46
%48 = load i8, i8* %47
%49 = icmp eq i8 %48, 0
%50 = add nuw i64 %46, 1
br i1 %49, label %51, label %45
51: ; preds = %45
%52 = shl i64 %46, 32
%53 = ashr exact i64 %52, 32
br label %54
54: ; preds = %51, %54
%55 = phi i64 [ %53, %51 ], [ %56, %54 ]
%56 = add nsw i64 %55, -1
%57 = getelementptr inbounds i8, i8* %0, i64 %56
%58 = load i8, i8* %57
%59 = icmp eq i8 %58, 32
br i1 %59, label %54, label %60
60: ; preds = %54, %28
%61 = phi i64 [ %29, %28 ], [ %55, %54 ]
%62 = shl i64 %61, 32
%63 = ashr exact i64 %62, 32
%64 = getelementptr inbounds i8, i8* %0, i64 %63
store i8 0, i8* %64
ret void
}