char *basefilename(pathname)
char *pathname;
{
  char delimiter = '/';
  short i;
  for (i = strlen(pathname) - 1; i >= 0 && pathname[i] != delimiter; i--)
    ;
  return (&pathname[i + 1]);
}


x86 assembly (clang, -O0):
<basefilename>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
movb   $0x2f,-0x9(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
sub    $0x1,%rax
mov    %ax,-0xc(%rbp)
movswl -0xc(%rbp),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0xd(%rbp)
jl     115c <basefilename+0x4c>
mov    -0x8(%rbp),%rax
movswq -0xc(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
movsbl -0x9(%rbp),%ecx
cmp    %ecx,%eax
setne  %al
mov    %al,-0xd(%rbp)
mov    -0xd(%rbp),%al
test   $0x1,%al
jne    116c <basefilename+0x5c>
jmp    1182 <basefilename+0x72>
jmp    1171 <basefilename+0x61>
mov    -0xc(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0xc(%rbp)
jmp    1131 <basefilename+0x21>
mov    -0x8(%rbp),%rax
movswl -0xc(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<basefilename>:
push   %rbx
mov    %rdi,%rbx
call   1030 <strlen@plt>
mov    %eax,%edx
add    $0xffffffff,%edx
cmp    $0xffff,%dx
mov    $0xffff,%ecx
cmovl  %edx,%ecx
nopw   0x0(%rax,%rax,1)
add    $0xffff,%ax
js     1141 <basefilename+0x31>
movzwl %ax,%edx
cmpb   $0x2f,(%rbx,%rdx,1)
jne    1130 <basefilename+0x20>
jmp    1143 <basefilename+0x33>
mov    %ecx,%eax
movswq %ax,%rax
add    %rbx,%rax
add    $0x1,%rax
pop    %rbx
ret

LLVM IR (-O0):
define i8* @basefilename(i8* %0) {
%2 = alloca i8*
%3 = alloca i8
%4 = alloca i16
store i8* %0, i8** %2
store i8 47, i8* %3
%5 = load i8*, i8** %2
%6 = call i64 @strlen(i8* %5)
%7 = sub i64 %6, 1
%8 = trunc i64 %7 to i16
store i16 %8, i16* %4
br label %9
9: ; preds = %26, %1
%10 = load i16, i16* %4
%11 = sext i16 %10 to i32
%12 = icmp sge i32 %11, 0
br i1 %12, label %13, label %23
13: ; preds = %9
%14 = load i8*, i8** %2
%15 = load i16, i16* %4
%16 = sext i16 %15 to i64
%17 = getelementptr inbounds i8, i8* %14, i64 %16
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = load i8, i8* %3
%21 = sext i8 %20 to i32
%22 = icmp ne i32 %19, %21
br label %23
23: ; preds = %13, %9
%24 = phi i1 [ false, %9 ], [ %22, %13 ]
br i1 %24, label %25, label %29
25: ; preds = %23
br label %26
26: ; preds = %25
%27 = load i16, i16* %4
%28 = add i16 %27, -1
store i16 %28, i16* %4
br label %9
29: ; preds = %23
%30 = load i8*, i8** %2
%31 = load i16, i16* %4
%32 = sext i16 %31 to i32
%33 = add nsw i32 %32, 1
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i8, i8* %30, i64 %34
ret i8* %35
}

LLVM IR (-O2):
define i8* @basefilename(i8* %0) {
%2 = tail call i64 @strlen(i8* dereferenceable(1) %0)
%3 = trunc i64 %2 to i16
%4 = add i16 %3, -1
%5 = call i16 @llvm.smin.i16(i16 %4, i16 -1)
br label %6
6: ; preds = %10, %1
%7 = phi i16 [ %3, %1 ], [ %8, %10 ]
%8 = add i16 %7, -1
%9 = icmp sgt i16 %8, -1
br i1 %9, label %10, label %15
10: ; preds = %6
%11 = zext i16 %8 to i64
%12 = getelementptr inbounds i8, i8* %0, i64 %11
%13 = load i8, i8* %12
%14 = icmp eq i8 %13, 47
br i1 %14, label %15, label %6
15: ; preds = %6, %10
%16 = phi i16 [ %5, %6 ], [ %8, %10 ]
%17 = sext i16 %16 to i64
%18 = add nsw i64 %17, 1
%19 = getelementptr inbounds i8, i8* %0, i64 %18
ret i8* %19
}