diff options
author | Chris Lattner <sabre@nondot.org> | 2006-05-13 02:06:03 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-05-13 02:06:03 +0000 |
commit | 70074e00a2342c2db7bb675a53750db9f4ac59e5 (patch) | |
tree | cba230bd23f133d74b3015bbeba8e18750698ab1 /lib/CodeGen | |
parent | 5250bae5eed2aa1989f6a710d56fe6eac5bd9e8e (diff) | |
download | llvm-70074e00a2342c2db7bb675a53750db9f4ac59e5.tar.gz llvm-70074e00a2342c2db7bb675a53750db9f4ac59e5.tar.bz2 llvm-70074e00a2342c2db7bb675a53750db9f4ac59e5.tar.xz |
Implement simple promotion for cast elimination in instcombine. This is
currently very limited, but can be extended in the future. For example,
we now compile:
uint %test30(uint %c1) {
%c2 = cast uint %c1 to ubyte
%c3 = xor ubyte %c2, 1
%c4 = cast ubyte %c3 to uint
ret uint %c4
}
to:
_xor:
movzbl 4(%esp), %eax
xorl $1, %eax
ret
instead of:
_xor:
movb $1, %al
xorb 4(%esp), %al
movzbl %al, %eax
ret
More impressively, we now compile:
struct B { unsigned bit : 1; };
void xor(struct B *b) { b->bit = b->bit ^ 1; }
To (X86/PPC):
_xor:
movl 4(%esp), %eax
xorl $-2147483648, (%eax)
ret
_xor:
lwz r2, 0(r3)
xoris r2, r2, 32768
stw r2, 0(r3)
blr
instead of (X86/PPC):
_xor:
movl 4(%esp), %eax
movl (%eax), %ecx
movl %ecx, %edx
shrl $31, %edx
# TRUNCATE movb %dl, %dl
xorb $1, %dl
movzbl %dl, %edx
andl $2147483647, %ecx
shll $31, %edx
orl %ecx, %edx
movl %edx, (%eax)
ret
_xor:
lwz r2, 0(r3)
srwi r4, r2, 31
xori r4, r4, 1
rlwimi r2, r4, 31, 0, 0
stw r2, 0(r3)
blr
This implements InstCombine/cast.ll:test30.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28273 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
0 files changed, 0 insertions, 0 deletions