mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-04 07:32:13 +00:00
Add another case we are not optimizing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129012 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8617897aaa
commit
3d195faaad
@ -1681,6 +1681,36 @@ Missed optimization: should be movl+andl.
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
The x86_64 abi says:
|
||||
|
||||
Booleans, when stored in a memory object, are stored as single byte objects the
|
||||
value of which is always 0 (false) or 1 (true).
|
||||
|
||||
We are not using this fact:
|
||||
|
||||
int bar(_Bool *a) { return *a; }
|
||||
|
||||
define i32 @bar(i8* nocapture %a) nounwind readonly optsize {
|
||||
%1 = load i8* %a, align 1, !tbaa !0
|
||||
%tmp = and i8 %1, 1
|
||||
%2 = zext i8 %tmp to i32
|
||||
ret i32 %2
|
||||
}
|
||||
|
||||
bar:
|
||||
movb (%rdi), %al
|
||||
andb $1, %al
|
||||
movzbl %al, %eax
|
||||
ret
|
||||
|
||||
GCC produces
|
||||
|
||||
bar:
|
||||
movzbl (%rdi), %eax
|
||||
ret
|
||||
|
||||
//===---------------------------------------------------------------------===//
|
||||
|
||||
Consider the following two functions compiled with clang:
|
||||
_Bool foo(int *x) { return !(*x & 4); }
|
||||
unsigned bar(int *x) { return !(*x & 4); }
|
||||
|
Loading…
x
Reference in New Issue
Block a user