mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-09 13:33:17 +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:
|
Consider the following two functions compiled with clang:
|
||||||
_Bool foo(int *x) { return !(*x & 4); }
|
_Bool foo(int *x) { return !(*x & 4); }
|
||||||
unsigned bar(int *x) { return !(*x & 4); }
|
unsigned bar(int *x) { return !(*x & 4); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user