char *afteralnum(s1, s2)
char *s1, *s2;
{
  while ((('a' <= *s1 && *s1 <= 'z') || ('A' <= *s1 && *s1 <= 'Z') ||
          ('0' <= *s1 && *s1 <= '9') || *s1 == '_'))
    *s2++ = *s1++;
  *s2 = 0;
  return (skipblanks(s1));
}


x86 assembly (clang, -O0):
<afteralnum>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x61,%eax
cmp    %ecx,%eax
jg     1149 <afteralnum+0x39>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x7a,%ecx
mov    %al,-0x11(%rbp)
jle    11ab <afteralnum+0x9b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x41,%eax
cmp    %ecx,%eax
jg     1172 <afteralnum+0x62>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x5a,%ecx
mov    %al,-0x11(%rbp)
jle    11ab <afteralnum+0x9b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x30,%eax
cmp    %ecx,%eax
jg     119b <afteralnum+0x8b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%ecx
mov    $0x1,%al
cmp    $0x39,%ecx
mov    %al,-0x11(%rbp)
jle    11ab <afteralnum+0x9b>
mov    -0x8(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5f,%eax
sete   %al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%al
test   $0x1,%al
jne    11bb <afteralnum+0xab>
jmp    11e2 <afteralnum+0xd2>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1120 <afteralnum+0x10>
mov    -0x10(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x8(%rbp),%rdi
mov    $0x0,%al
call   1030 <skipblanks@plt>
cltq
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<afteralnum>:
push   %rax
jmp    112a <afteralnum+0x1a>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rdi
mov    %al,(%rsi)
add    $0x1,%rsi
movzbl (%rdi),%eax
mov    %eax,%ecx
and    $0xdf,%cl
add    $0xbf,%cl
cmp    $0x1a,%cl
jb     1120 <afteralnum+0x10>
lea    -0x30(%rax),%ecx
cmp    $0x5f,%al
je     1120 <afteralnum+0x10>
cmp    $0x9,%cl
jbe    1120 <afteralnum+0x10>
movb   $0x0,(%rsi)
xor    %eax,%eax
call   1030 <skipblanks@plt>
cltq
pop    %rcx
ret

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

LLVM IR (-O2):
define i8* @afteralnum(i8* %0, i8* nocapture writeonly %1) {
br label %3
3: ; preds = %15, %2
%4 = phi i8* [ %0, %2 ], [ %16, %15 ]
%5 = phi i8* [ %1, %2 ], [ %17, %15 ]
%6 = load i8, i8* %4
%7 = and i8 %6, -33
%8 = add i8 %7, -65
%9 = icmp ult i8 %8, 26
br i1 %9, label %15, label %10
10: ; preds = %3
%11 = add i8 %6, -48
%12 = icmp ult i8 %11, 10
%13 = icmp eq i8 %6, 95
%14 = or i1 %13, %12
br i1 %14, label %15, label %18
15: ; preds = %10, %3
%16 = getelementptr inbounds i8, i8* %4, i64 1
%17 = getelementptr inbounds i8, i8* %5, i64 1
store i8 %6, i8* %5
br label %3
18: ; preds = %10
store i8 0, i8* %5
%19 = tail call i32 (i8*, ...) bitcast (i32 (...)* @skipblanks to i32 (i8*, ...)*)(i8* %4)
%20 = sext i32 %19 to i64
%21 = inttoptr i64 %20 to i8*
ret i8* %21
}