char *NextWord(char *in) {
  while ((*in <= ' ') && (*in > '\0'))
    in++;
  while ((*in > ' ') || (*in < '\0'))
    in++;
  while ((*in <= ' ') && (*in > '\0'))
    in++;
  return (in);
}


x86 assembly (clang, -O0):
<NextWord>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0x9(%rbp)
jg     112d <NextWord+0x2d>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setg   %al
mov    %al,-0x9(%rbp)
mov    -0x9(%rbp),%al
test   $0x1,%al
jne    113d <NextWord+0x3d>
jmp    114e <NextWord+0x4e>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1108 <NextWord+0x8>
jmp    1153 <NextWord+0x53>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0xa(%rbp)
jg     1178 <NextWord+0x78>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setl   %al
mov    %al,-0xa(%rbp)
mov    -0xa(%rbp),%al
test   $0x1,%al
jne    1188 <NextWord+0x88>
jmp    1199 <NextWord+0x99>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    1153 <NextWord+0x53>
jmp    119e <NextWord+0x9e>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x20,%ecx
mov    %al,-0xb(%rbp)
jg     11c3 <NextWord+0xc3>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setg   %al
mov    %al,-0xb(%rbp)
mov    -0xb(%rbp),%al
test   $0x1,%al
jne    11d3 <NextWord+0xd3>
jmp    11e4 <NextWord+0xe4>
mov    -0x8(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x8(%rbp)
jmp    119e <NextWord+0x9e>
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<NextWord>:
mov    %rdi,%rax
add    $0xffffffffffffffff,%rax
nopw   0x0(%rax,%rax,1)
movzbl 0x1(%rax),%ecx
add    $0x1,%rax
lea    -0x1(%rcx),%edx
cmp    $0x20,%dl
jb     1110 <NextWord+0x10>
cmp    $0x21,%cl
jb     113d <NextWord+0x3d>
cs nopw 0x0(%rax,%rax,1)
nop
movzbl 0x1(%rax),%ecx
add    $0x1,%rax
cmp    $0x20,%cl
ja     1130 <NextWord+0x30>
add    $0xff,%cl
cmp    $0x1f,%cl
ja     1160 <NextWord+0x60>
cs nopw 0x0(%rax,%rax,1)
nop
movzbl 0x1(%rax),%ecx
add    $0x1,%rax
add    $0xff,%cl
cmp    $0x20,%cl
jb     1150 <NextWord+0x50>
ret

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

LLVM IR (-O2):
define i8* @NextWord(i8* %0) {
br label %2
2: ; preds = %2, %1
%3 = phi i8* [ %0, %1 ], [ %7, %2 ]
%4 = load i8, i8* %3
%5 = add i8 %4, -1
%6 = icmp ult i8 %5, 32
%7 = getelementptr inbounds i8, i8* %3, i64 1
br i1 %6, label %2, label %8
8: ; preds = %2
%9 = icmp ugt i8 %4, 32
br i1 %9, label %15, label %10
10: ; preds = %15, %8
%11 = phi i8 [ %4, %8 ], [ %18, %15 ]
%12 = phi i8* [ %3, %8 ], [ %17, %15 ]
%13 = add i8 %11, -1
%14 = icmp ult i8 %13, 32
br i1 %14, label %20, label %26
15: ; preds = %8, %15
%16 = phi i8* [ %17, %15 ], [ %3, %8 ]
%17 = getelementptr inbounds i8, i8* %16, i64 1
%18 = load i8, i8* %17
%19 = icmp ugt i8 %18, 32
br i1 %19, label %15, label %10
20: ; preds = %10, %20
%21 = phi i8* [ %22, %20 ], [ %12, %10 ]
%22 = getelementptr inbounds i8, i8* %21, i64 1
%23 = load i8, i8* %22
%24 = add i8 %23, -1
%25 = icmp ult i8 %24, 32
br i1 %25, label %20, label %26
26: ; preds = %20, %10
%27 = phi i8* [ %12, %10 ], [ %22, %20 ]
ret i8* %27
}