int bcmp2(p1, p2)
char *p1, *p2;
{
  long *i1, *i2;
  char *c1, *c2;
  for (i1 = (long *)p1, i2 = (long *)p2; *i1++ == *i2++;)
    ;
  for (c1 = (char *)(i1 - 1), c2 = (char *)(i2 - 1); *c1 == *c2; c1++, c2++)
    ;
  return c1 - p1;
}


x86 assembly (clang, -O0):
<bcmp2>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%rax
mov    -0x20(%rbp),%rcx
mov    %rcx,%rdx
add    $0x8,%rdx
mov    %rdx,-0x20(%rbp)
cmp    (%rcx),%rax
jne    114b <bcmp2+0x4b>
jmp    111c <bcmp2+0x1c>
mov    -0x18(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
mov    -0x30(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    119b <bcmp2+0x9b>
jmp    117e <bcmp2+0x7e>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1163 <bcmp2+0x63>
mov    -0x28(%rbp),%rax
mov    -0x8(%rbp),%rcx
sub    %rcx,%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bcmp2>:
add    $0xfffffffffffffff9,%rsi
lea    -0x8(%rdi),%rax
nopl   0x0(%rax,%rax,1)
mov    0x8(%rax),%rcx
add    $0x8,%rax
mov    0x7(%rsi),%rdx
add    $0x8,%rsi
cmp    %rdx,%rcx
je     1110 <bcmp2+0x10>
cmp    %dl,%cl
jne    1143 <bcmp2+0x43>
nopl   0x0(%rax)
movzbl 0x1(%rax),%ecx
add    $0x1,%rax
lea    0x1(%rsi),%rdx
cmp    (%rsi),%cl
mov    %rdx,%rsi
je     1130 <bcmp2+0x30>
sub    %edi,%eax
ret

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

LLVM IR (-O2):
define i32 @bcmp2(i8* %0, i8* nocapture %1) {
%3 = bitcast i8* %0 to i64*
%4 = bitcast i8* %1 to i64*
br label %5
5: ; preds = %5, %2
%6 = phi i64* [ %3, %2 ], [ %8, %5 ]
%7 = phi i64* [ %4, %2 ], [ %10, %5 ]
%8 = getelementptr inbounds i64, i64* %6, i64 1
%9 = load i64, i64* %6
%10 = getelementptr inbounds i64, i64* %7, i64 1
%11 = load i64, i64* %7
%12 = icmp eq i64 %9, %11
br i1 %12, label %5, label %13
13: ; preds = %5
%14 = trunc i64 %11 to i8
%15 = trunc i64 %9 to i8
%16 = bitcast i64* %6 to i8*
%17 = icmp eq i8 %15, %14
br i1 %17, label %18, label %28
18: ; preds = %13
%19 = bitcast i64* %7 to i8*
br label %20
20: ; preds = %18, %20
%21 = phi i8* [ %24, %20 ], [ %19, %18 ]
%22 = phi i8* [ %23, %20 ], [ %16, %18 ]
%23 = getelementptr inbounds i8, i8* %22, i64 1
%24 = getelementptr inbounds i8, i8* %21, i64 1
%25 = load i8, i8* %23
%26 = load i8, i8* %24
%27 = icmp eq i8 %25, %26
br i1 %27, label %20, label %28
28: ; preds = %20, %13
%29 = phi i8* [ %16, %13 ], [ %23, %20 ]
%30 = ptrtoint i8* %29 to i64
%31 = ptrtoint i8* %0 to i64
%32 = sub i64 %30, %31
%33 = trunc i64 %32 to i32
ret i32 %33
}