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/ExecutionEngine/ExecutionEngine.cpp | |
| parent | 5250bae5eed2aa1989f6a710d56fe6eac5bd9e8e (diff) | |
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/ExecutionEngine/ExecutionEngine.cpp')
0 files changed, 0 insertions, 0 deletions
