aboutsummaryrefslogtreecommitdiff
path: root/llvm/examples/ModuleMaker/ModuleMaker.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-05-13 02:06:03 +0000
committerChris Lattner <sabre@nondot.org>2006-05-13 02:06:03 +0000
commit1ebbe6a22eb69a6d9f9ac309f20b2fe0b11e0998 (patch)
treeca9d1aff84a754299a2be949a17e19e53c5b057e /llvm/examples/ModuleMaker/ModuleMaker.cpp
parent4edab0f7a79cc3f3ab3eb082e5ca3069c0d21e36 (diff)
downloadllvm-1ebbe6a22eb69a6d9f9ac309f20b2fe0b11e0998.zip
llvm-1ebbe6a22eb69a6d9f9ac309f20b2fe0b11e0998.tar.gz
llvm-1ebbe6a22eb69a6d9f9ac309f20b2fe0b11e0998.tar.bz2
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. llvm-svn: 28273
Diffstat (limited to 'llvm/examples/ModuleMaker/ModuleMaker.cpp')
0 files changed, 0 insertions, 0 deletions