char *eat_blank(char *s) {
again:
  while ((*s == ' ') || (*s == '\t') || (*s == '\n'))
    s++;
  if (*s == '#') {
    while (*s != '\n')
      s++;
    goto again;
  }
  return s;
}


x86 assembly (clang, -O0):
<eat_blank>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
jmp    110d <eat_blank+0xd>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x9(%rbp)
je     1147 <eat_blank+0x47>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x9,%ecx
mov    %al,-0x9(%rbp)
je     1147 <eat_blank+0x47>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
sete   %al
mov    %al,-0x9(%rbp)
mov    -0x9(%rbp),%al
test   $0x1,%al
jne    1157 <eat_blank+0x57>
jmp    1168 <eat_blank+0x68>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    110d <eat_blank+0xd>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x23,%eax
jne    11a3 <eat_blank+0xa3>
jmp    117d <eat_blank+0x7d>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0xa,%eax
je     119e <eat_blank+0x9e>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    117d <eat_blank+0x7d>
jmp    1108 <eat_blank+0x8>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<eat_blank>:
mov    %rdi,%rax
jmp    1114 <eat_blank+0x14>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x1,%rax
mov    (%rax),%cl
lea    -0x9(%rcx),%edx
cmp    $0x2,%dl
jb     1110 <eat_blank+0x10>
cmp    $0x20,%cl
je     1110 <eat_blank+0x10>
cmp    $0x23,%cl
jne    113f <eat_blank+0x3f>
mov    %rax,%rcx
nopl   0x0(%rax,%rax,1)
lea    0x1(%rcx),%rax
cmpb   $0xa,0x1(%rcx)
mov    %rax,%rcx
jne    1130 <eat_blank+0x30>
jmp    1114 <eat_blank+0x14>
ret

LLVM IR (-O0):
define i8* @eat_blank(i8* %0) {
%2 = alloca i8*
store i8* %0, i8** %2
br label %3
3: ; preds = %38, %1
br label %4
4: ; preds = %21, %3
%5 = load i8*, i8** %2
%6 = load i8, i8* %5
%7 = sext i8 %6 to i32
%8 = icmp eq i32 %7, 32
br i1 %8, label %19, label %9
9: ; preds = %4
%10 = load i8*, i8** %2
%11 = load i8, i8* %10
%12 = sext i8 %11 to i32
%13 = icmp eq i32 %12, 9
br i1 %13, label %19, label %14
14: ; preds = %9
%15 = load i8*, i8** %2
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = icmp eq i32 %17, 10
br label %19
19: ; preds = %14, %9, %4
%20 = phi i1 [ true, %9 ], [ true, %4 ], [ %18, %14 ]
br i1 %20, label %21, label %24
21: ; preds = %19
%22 = load i8*, i8** %2
%23 = getelementptr inbounds i8, i8* %22, i32 1
store i8* %23, i8** %2
br label %4
24: ; preds = %19
%25 = load i8*, i8** %2
%26 = load i8, i8* %25
%27 = sext i8 %26 to i32
%28 = icmp eq i32 %27, 35
br i1 %28, label %29, label %39
29: ; preds = %24
br label %30
30: ; preds = %35, %29
%31 = load i8*, i8** %2
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = icmp ne i32 %33, 10
br i1 %34, label %35, label %38
35: ; preds = %30
%36 = load i8*, i8** %2
%37 = getelementptr inbounds i8, i8* %36, i32 1
store i8* %37, i8** %2
br label %30
38: ; preds = %30
br label %3
39: ; preds = %24
%40 = load i8*, i8** %2
ret i8* %40
}

LLVM IR (-O2):
define i8* @eat_blank(i8* %0) {
br label %2
2: ; preds = %7, %1
%3 = phi i8* [ %0, %1 ], [ %8, %7 ]
%4 = load i8, i8* %3
switch i8 %4, label %14 [
i8 32, label %5
i8 9, label %5
i8 10, label %5
i8 35, label %9
]
5: ; preds = %2, %2, %2
%6 = getelementptr inbounds i8, i8* %3, i64 1
br label %7
7: ; preds = %9, %5
%8 = phi i8* [ %6, %5 ], [ %11, %9 ]
br label %2
9: ; preds = %2, %9
%10 = phi i8* [ %11, %9 ], [ %3, %2 ]
%11 = getelementptr inbounds i8, i8* %10, i64 1
%12 = load i8, i8* %11
%13 = icmp eq i8 %12, 10
br i1 %13, label %7, label %9
14: ; preds = %2
ret i8* %3
}